比较逗号分隔的字符串是否有相同的数字

问题描述 投票:0回答:1

我有两个字符串,第一个字符串如下所示:24,36,78,98 第二个是这样的:25,36,88,98

现在我想做的是比较sql中的两个字符串,只返回每个字符串中相同的数字。

这在 sql 中可能吗?还是我必须用 PL/SQL 之类的语言编写自己的函数?

我用谷歌搜索但找不到这个问题的任何答案。

sql plsql oracle11g
1个回答
0
投票

可以在 SQL 中比较两个字符串并返回每个字符串中相同的数字。您可以使用 SQL 中提供的字符串操作函数来实现此目的。

SELECT value AS common_number
FROM STRING_SPLIT('24,36,78,98', ',')
INTERSECT
SELECT value
FROM STRING_SPLIT('25,36,88,98', ',');

如果您的数据库系统不支持 STRING_SPLIT 或 INTERSECT,您可以使用 INNER JOIN 获得相同的结果,否则您将必须实现自定义解决方案来拆分字符串并比较值。

定制解决方案-

WITH RECURSIVE SplitValues AS (
  SELECT 
    SUBSTR(string1, 1, CASE INSTR(string1, ',') WHEN 0 THEN LENGTH(string1) ELSE INSTR(string1, ',') - 1 END) AS value,
    SUBSTR(string1, CASE INSTR(string1, ',') WHEN 0 THEN LENGTH(string1) + 1 ELSE INSTR(string1, ',') + 1 END) AS remaining,
    SUBSTR(string2, 1, CASE INSTR(string2, ',') WHEN 0 THEN LENGTH(string2) ELSE INSTR(string2, ',') - 1 END) AS value2,
    SUBSTR(string2, CASE INSTR(string2, ',') WHEN 0 THEN LENGTH(string2) + 1 ELSE INSTR(string2, ',') + 1 END) AS remaining2
  FROM (
    SELECT '24,36,78,98' AS string1, '25,36,88,98' AS string2
  )
  UNION ALL
  SELECT 
    SUBSTR(remaining, 1, CASE INSTR(remaining, ',') WHEN 0 THEN LENGTH(remaining) ELSE INSTR(remaining, ',') - 1 END),
    SUBSTR(remaining, CASE INSTR(remaining, ',') WHEN 0 THEN LENGTH(remaining) + 1 ELSE INSTR(remaining, ',') + 1 END),
    SUBSTR(remaining2, 1, CASE INSTR(remaining2, ',') WHEN 0 THEN LENGTH(remaining2) ELSE INSTR(remaining2, ',') - 1 END),
    SUBSTR(remaining2, CASE INSTR(remaining2, ',') WHEN 0 THEN LENGTH(remaining2) + 1 ELSE INSTR(remaining2, ',') + 1 END)
  FROM SplitValues
  WHERE remaining <> '' OR remaining2 <> ''
)
SELECT DISTINCT value AS common_number
FROM SplitValues
WHERE value IN (SELECT value2 FROM SplitValues);
© www.soinside.com 2019 - 2024. All rights reserved.