查找匹配的号码
Posted
技术标签:
【中文标题】查找匹配的号码【英文标题】:Find matching numbers 【发布时间】:2021-12-02 13:19:24 【问题描述】:我正在尝试编写一个 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
这样进入循环。有谁知道我该怎么做?
【问题讨论】:
【参考方案1】:你说的有问题。您不能将yes
(字符串)放入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>
【讨论】:
【参考方案2】:首先,如果你想产生随机的整数,从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
【讨论】:
以上是关于查找匹配的号码的主要内容,如果未能解决你的问题,请参考以下文章