db2 - 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 可以有任意数量的值,用逗号分隔。
解决方案
尝试这个:
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链接。
推荐阅读
- r - R cor() 返回不对称结果
- java - 使用 H2OApi Java 绑定检索 H2O 帧摘要以 MalformedJsonException 结尾
- vba - 检查Access表中是否已经存在数据
- android - 如何将 TextEditInputLayout 恢复为原来的提示?
- c# - 未安装项目目标框架 4.7.1 和 4.7.2
- javascript - 如何根据 javaScript 中的条件从对象中删除值
- c++ - 在 C++ 中初始化对象
- typo3 - TYPO3 - 嵌套网格元素
- java - 已解决 - JSONArray 在 var 中不起作用,但在 println- JSON Java AP 中起作用 -
- java - 如何将 JSONObject 转换为 java 对象