首页 > 解决方案 > DB2 - 字符串操作

问题描述

我们可以检查一个逗号分隔的字符串值是否存在于 DB2 中的另一个逗号分隔的字符串中?

我说了两个字符串,如下所示

Case-1:
String-1:'ABC,XYZ,PQR'
Srting-2:'MNO,PQR'

我想在 DB2 中有任何函数在上述情况下应该返回 1,因为来自 String-2 的 PQR 存在于 String-1 中。该值应匹配逗号内或逗号之后或之前的任何字符串。

Case-2:
String-1:'ABC,XYZ,PQR'
Srting-2:'MNO,P QR'

但是对于上述情况,相同的函数应该返回 0。因为“P”后面有空格

我还希望有一个类似的函数,它应该返回连接的字符串但删除重复项。

Case-1:
String-1:'ABC,XYZ,PQR'
Srting-2:'MNO,PQR'

Output should be 'ABC,XYZ,PQR,MNO' . 

在这种情况下,逗号分隔值的顺序无关紧要;但 PQR 不应重复两次。

Case-2:
String-1:'ABC,XYZ,PQR'
Srting-2:'MNO,P QR'

In this case output should be 'ABC,XYZ,PQR,MNO,P QR' .

我正在尝试使用 SQL 或 DB2 中的任何函数来实现这一点。

还有另一种情况,我想删除字符串的匹配部分

Case-3:
String-1:'ABC,XYZ,PQR'
Srting-2:'MNO,PQR'

Output should be 'ABC,XYZ,MNO'

显然 String-1 和 String-2 可以有任意数量的值,用逗号分隔。

标签: db2

解决方案


尝试这个:

CREATE FUNCTION SPLITTER (P_STR VARCHAR(4000), P_DELIM VARCHAR(10))
RETURNS TABLE (SEQ INT, TOKEN VARCHAR(50))
RETURN
SELECT TOK.SEQ, TOK.TOKEN
FROM XMLTABLE
(
  'for $id in tokenize($s, $t) return <i>{string($id)}</i>' PASSING P_STR AS "s", P_DELIM AS "t"
  COLUMNS
    SEQ   FOR ORDINALITY
  , TOKEN VARCHAR(50) PATH '.'
) TOK;

SELECT 
CASE 
  WHEN EXISTS 
  (
  SELECT 1 
  FROM TABLE (SPLITTER ('ABC,XYZ,PQR', ',')) A
  JOIN TABLE (SPLITTER ('MNO,PQR', ',')) B ON B.TOKEN = A.TOKEN
  )
  THEN 1
  ELSE 0
END
FROM SYSIBM.SYSDUMMY1;

SELECT LISTAGG (TOKEN, ',')
FROM
(
SELECT TOKEN
FROM TABLE (SPLITTER ('ABC,XYZ,PQR', ','))
  UNION
SELECT TOKEN
FROM TABLE (SPLITTER ('MNO,PQR', ','))
);

SELECT LISTAGG (TOKEN, ',')
FROM
(
  SELECT DISTINCT COALESCE (A.TOKEN, B.TOKEN) AS TOKEN
  FROM TABLE (SPLITTER ('ABC,XYZ,PQR', ',')) A
  FULL JOIN TABLE (SPLITTER ('MNO,PQR', ',')) B ON B.TOKEN = A.TOKEN
  WHERE A.TOKEN IS NULL OR B.TOKEN IS NULL
);

dbfiddle链接。


推荐阅读