我正在嘗試撰寫一個 PLSQL 查詢,它將在兩個單獨的列中列印隨機整數。它將總共列印 1000 個數字(每行隨機 1 - 50)。我需要弄清楚的是,在完成此操作后,如果第二列與第一列匹配,則將第二列替換為“是”或“否”,例如:
Col A Col B
10 NO(42)
32 NO(12)
25 YES(25)
等等。這是我的代碼:
CREATE TABLE table
(random_num INTEGER NOT NULL,
match INTEGER NOT NULL);
Declare
CURSOR cur_ IS
(Select
random_num,
match
from table);
Begin
FOR rec_ IN 1..1000
LOOP
INSERT INTO "table" (random_num,match) VALUES (DBMS_RANDOM.VALUE(1,50),DBMS_RANDOM.VALUE(1,50));
END LOOP;
END;
現在這有效,因為我用亂數獲得每列的兩行 1000 行,但我需要實作這個選擇:
SELECT random_num, CASE WHEN random_num = match THEN 'yes' ELSE 'no' END as match
FROM table
進入回圈如此。關于我該怎么做的任何人?
uj5u.com熱心網友回復:
你說的有問題。您不能將yes(string) 放入INTEGER資料型別列中。
這更有意義:
示例表:
SQL> CREATE TABLE test
2 (
3 random_num_1 INTEGER NOT NULL,
4 random_num_2 INTEGER NOT NULL,
5 match VARCHAR2 (3) NOT NULL
6 );
Table created.
程式:使用區域變數來存盤亂數;那么很容易比較它們。
SQL> DECLARE
2 val1 NUMBER;
3 val2 NUMBER;
4 BEGIN
5 FOR i IN 1 .. 10 --> change it to 1000
6 LOOP
7 val1 := DBMS_RANDOM.VALUE (1, 50);
8 val2 := DBMS_RANDOM.VALUE (1, 50);
9
10 INSERT INTO test (random_num_1, random_num_2, match)
11 VALUES (val1,
12 val2,
13 CASE WHEN val1 = val2 THEN 'yes' ELSE 'no' END);
14 END LOOP;
15 END;
16 /
PL/SQL procedure successfully completed.
結果:
SQL> SELECT * FROM test;
RANDOM_NUM_1 RANDOM_NUM_2 MAT
------------ ------------ ---
45 31 no
40 48 no
43 27 no
49 41 no
6 38 no
5 18 no
18 35 no
15 34 no
11 19 no
37 39 no
10 rows selected.
SQL>
uj5u.com熱心網友回復:
首先,如果你想產生從1 到 50的等分布的隨機整數,你必須小心。
[DBMS_RANDOM.VALUE (1, 50)][1]回傳大于或等于1 且小于50的十進制數。
例子
select DBMS_RANDOM.VALUE (1, 50) col from dual;
COL
----------
30,4901593
您cast的結果INTEGER是執行四舍五入的型別,因此您將看到所有數字,但 1 和 50 的出現頻率僅為其他數字的一半。
所以獲得隨機整數的更好方法 1 .. 50 是1 trunc(50*DBMS_RANDOM.VALUE)
VALUE 不帶引數回傳 [0,1)
通常,如果您不需要使用,PL/SQL請不要使用它
create table tab1 as
select 1 trunc(50*DBMS_RANDOM.VALUE) col1, 1 trunc(50*DBMS_RANDOM.VALUE) col2
from dual connect by level <= 10 /* increase as much rows are needed */
并將該MATCH 列添加為虛擬
alter table tab1
add (match varchar2(3) generated always as (
case when col1 = col2 then 'YES' else 'NO' end ) virtual);
COL1 COL2 MAT
---------- ---------- ---
33 6 NO
26 28 NO
35 22 NO
30 27 NO
17 45 NO
31 4 NO
11 21 NO
2 48 NO
35 25 NO
39 15 NO
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373093.html
上一篇:Ifelseif條件出錯-SQL中缺少關鍵字|甲骨文|
下一篇:OracleSQL語法含義
