如何解决SQL比较以空格分隔的值
亲爱的
我的oracle表中具有如下值:
值之间用空格分隔。我需要检查value1列中存在的所有值是否都存在于value2中。如果是,请通过“ Y”更新isMatch。
我能够做到这一点,因为我的表包含200万条记录,这花费了很多时间。
这可以通过SQL完成吗?
------关于padaleiana的答案的最新信息----
请在下面找到说明计划:
我已经添加了/ * + ORDERED USE_HASH(b)附加* /提示,并在value1和value2上创建了索引,但是成本仍然很高。
谢谢。
解决方法
也许有更好更好的解决方案,但下面是一个解决方案(假设您的表称为table1
)
MERGE INTO table1 t1
USING table1 t2 ON (regexp_count(t2.value1,replace(t1.value1,' ','|')) =
regexp_count(t1.value2,'|')))
WHEN MATCHED THEN
UPDATE SET t1.isMatch = 'Y';
MERGE
command就像一个 upsert 。在这种情况下,您只需要使用WHEN MATCHED THEN...
,因为如果找不到不匹配的行,则不想插入新值。REGEXP_COUNT
指示字符串中某个模式出现的次数。在这里,模式为replace(t1.value1,'|')
(用|
替换空格),字符串为t1.value1
。
这里是demo。
,每个值列都可以分别拆分,排序和合并。在连接过程中,通过将相对于原始表的每个ID值的最大拣选件数进行比较,来检验每个分割件的相等性。因此,请使用以下查询:
WITH t1 AS
(
SELECT DISTINCT ID,REGEXP_SUBSTR(value1,'[^ ]+',1,level) AS value1,level AS cnt
FROM t -- original table
CONNECT BY level <= REGEXP_COUNT(value1,' ') + 1
AND PRIOR SYS_GUID() IS NOT NULL
AND PRIOR ID = ID
ORDER BY value1
),t2 AS
(
SELECT DISTINCT ID,REGEXP_SUBSTR(value2,level) AS value2,level AS cnt
FROM t
CONNECT BY level <= REGEXP_COUNT(value2,' ') + 1
AND PRIOR SYS_GUID() IS NOT NULL
AND PRIOR ID = ID
ORDER BY value2
)
SELECT DISTINCT t.*,CASE WHEN SUM(CASE WHEN t1.value1 = t2.value2 THEN 1 END) OVER (PARTITION BY t.ID)
= MAX(t1.cnt) OVER (PARTITION BY t.ID)
THEN
'Y'
ELSE
'N'
END AS ismatch
FROM t
LEFT JOIN t1
ON t1.ID = t.ID
LEFT JOIN t2
ON t2.ID = t1.ID
AND t1.value1 = t2.value2
ORDER BY t.ID;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。