【问题标题】: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

这样进入循环。有谁知道我该怎么做?

【问题讨论】:

    标签: oracle plsql


    【解决方案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
      

      castINTEGER 类型的结果,它执行四舍五入,所以你会看到所有的数字,但是1 和50 只会出现一半其他数字。

      所以获取随机整数的更好方法1 .. 501 + 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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-13
        • 2013-08-29
        • 2019-10-17
        相关资源
        最近更新 更多