oracle SQL使用LIKE运算符从表中获取多个值

hsgswve4  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(156)

我有一个数字列表,保存在一个名为A的表中。我想在另一个名为K的表中搜索这些数字。在这个名为K的表中,我试图搜索一个名为PAR的列,该列包含像A这样的值以及其他包含字符和数字的值。
比如说;我的表A有一个数字:
12312312312
表K列PAR类似于
#NUM=12312312312#NA=45453#085937.....
表A包含20 k数据。我试图找出表K列PAR是否包括这20 k个值。我怎么能这么做呢?
我使用TOAD和ORACLE SQL。我不想使用PL/SQL。谢谢你,谢谢

g6baxovj

g6baxovj1#

也许你可以使用简单的InStr()函数来查看某个字符串中是否包含数字。就像这样:

WITH 
    A AS
        (Select 1 "ID", 12312312312 "PAR" From Dual Union All
         Select 2 "ID", 14576 "PAR" From Dual),
    K AS
        (Select 1 "ID", '#NUM=12312312312#NA=45453#085937.....' "PAR" From Dual Union All
         Select 2 "ID", '#NUM=56756756756#NA=45453#085937.....' "PAR" From Dual)
Select To_Char(A.PAR) "PAR", Case When InStr(K.PAR, '#NUM=' || To_Char(A.PAR) || '#NA') = 0 Then 'Not Exists' Else 'Exists' End "EXISTS" 
From A
Inner Join K ON(K.ID = A.ID)

--  PAR                                      EXISTS    
--  ---------------------------------------- ----------
--  12312312312                              Exists    
--  14576                                    Not Exists

你应该包括一些分隔符,比如“#NUM=123123..“或其他任何可以确保数据行之间精确匹配的内容。这只是一些思考。
InStr()函数可以在Select命令的任何部分使用-无论是在选择列表中还是在join或where条件中。它在大数据集上比RegExp快得多。

b91juud3

b91juud32#

这里有一个选项,它将par拆分为多行(只包含数值),并将子查询结果与a表的num列连接(使用to_char函数,以避免隐式数据类型转换和误报结果)。
样本数据:

SQL> WITH
  2     a (num)
  3     AS
  4        (SELECT 12312312312 FROM DUAL
  5         UNION ALL
  6         SELECT 1231 FROM DUAL
  7         UNION ALL
  8         SELECT 85937 FROM DUAL),
  9     k (par)
 10     AS
 11        (SELECT '#NUM=12312312312#NA=45453#085937' FROM DUAL
 12         UNION ALL
 13         SELECT '#XY=12319' FROM DUAL
 14         UNION ALL
 15         SELECT '#FM=1185937#NUM=1231#12310' FROM DUAL)

查询方式:

16  SELECT x.par, a.num
 17    FROM a
 18         JOIN (
 19                 SELECT PAR, REGEXP_SUBSTR (par,
 20                                       '\d+',
 21                                       1,
 22                                       COLUMN_VALUE) kpar
 23                   FROM k
 24                        CROSS JOIN
 25                        TABLE (
 26                           CAST (
 27                              MULTISET (    SELECT LEVEL
 28                                              FROM DUAL
 29                                        CONNECT BY LEVEL <= REGEXP_COUNT (par, '=') + 1)
 30                                 AS SYS.odcinumberlist))
 31              ) x
 32            ON TO_CHAR (a.num) = x.kpar;

PAR                                           NUM
-------------------------------- ----------------
#NUM=12312312312#NA=45453#085937      12312312312
#FM=1185937#NUM=1231#12310                   1231

SQL>

另外你说
我不允许使用PL/SQL
没有这样的补助金。你可能不会被授权创建PL/SQL命名的程序单元(函数,过程,触发器,包),但你肯定可以创建一个匿名PL/SQL块。

相关问题