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
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>
2条答案
按热度按时间g6baxovj1#
也许你可以使用简单的InStr()函数来查看某个字符串中是否包含数字。就像这样:
你应该包括一些分隔符,比如“#NUM=123123..“或其他任何可以确保数据行之间精确匹配的内容。这只是一些思考。
InStr()函数可以在Select命令的任何部分使用-无论是在选择列表中还是在join或where条件中。它在大数据集上比RegExp快得多。
b91juud32#
这里有一个选项,它将
par
拆分为多行(只包含数值),并将子查询结果与a
表的num
列连接(使用to_char
函数,以避免隐式数据类型转换和误报结果)。样本数据:
查询方式:
另外你说
我不允许使用PL/SQL
没有这样的补助金。你可能不会被授权创建PL/SQL命名的程序单元(函数,过程,触发器,包),但你肯定可以创建一个匿名PL/SQL块。