查找匹配的号码

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

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 

【讨论】:

以上是关于查找匹配的号码的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 中查找与部分电话号码数组匹配的文档

查询以匹配两个表中具有相同电话号码区号的列

将电话号码与地址簿中的确定性匹配

正则介绍,创建匹配Regex对象

两张excel表格如何找出相同的身份证号码?【急】

正则表达式匹配电话号码和手机号码