如何将DB2中特定格式表数据作为SQL查询WHERE子句参数
DB2中处理带单引号的逗号分隔值作为IN子句参数的问题
问题原因
你原查询的问题在于:Table2的Column1存储的是带单引号的完整字符串(如'123','984'),当直接用子查询返回这个字符串到IN子句时,DB2会把整个字符串当作单一值去匹配Table1的Column1,而Table1的Column1是单个数字(如123、984),自然无法匹配,所以得不到预期结果。
解决方案
需要先将Table2中Column1的字符串拆分成单个数值,再用于匹配。可以使用DB2的XMLTABLE结合字符串处理函数实现:
SELECT t1.* FROM table1 t1 WHERE t1.column1 IN ( -- 拆分Table2的Column1为单个数值 SELECT CAST(TRIM(token) AS INTEGER) FROM table2 t2, XMLTABLE( 'tokenize($clean_str, '','')' -- 清理字符串:去掉首尾单引号,替换中间的''','''为逗号 PASSING REGEXP_REPLACE(t2.column1, '^''|''$|'''',', '') AS clean_str COLUMNS token VARCHAR(10) PATH '.' ) AS split_vals WHERE t2.column2 = 'XXX' );
语句说明
- REGEXP_REPLACE:清理原始字符串
^'':去掉字符串开头的单引号''$:去掉字符串结尾的单引号'''',:把中间的'','替换为空(将'123','984'处理成123,984)
- XMLTABLE + tokenize:将清理后的逗号分隔字符串拆分成行,每行对应一个数值
- CAST(TRIM(token) AS INTEGER):将拆分后的字符串转成整数,匹配Table1的Column1类型
执行该查询后,会得到你期望的结果:
Column1 Column2 123 ABC 984 XYZ
内容的提问来源于stack exchange,提问作者max092012
相关产品推荐
相关产品推荐

