如何使用STRING_SPLIT函数比对匹配两张表的发票字段值
解答
完全可以使用STRING_SPLIT函数实现这个匹配需求。
你之前的写法有两个小问题:一是函数名拼写错误,正确函数名是STRING_SPLIT而非SPLIT_STRING;二是需要先遍历表2所有行的逗号分隔字段做拆分,不能直接在子查询里单次调用拆分函数。
补全后的可直接运行的SQL如下:
SELECT * FROM TABLE1 WHERE INVOICE IN ( -- 拆分后返回的单值列固定名为value,加TRIM规避逗号前后的空格干扰匹配 SELECT TRIM(value) FROM TABLE2 -- 对表2每一行的Invoices字段做拆分,把多值列表拆成独立的单值行 CROSS APPLY STRING_SPLIT(INVOICES, ',') )
注意事项
- 上述写法适用于SQL Server 2016及以上版本、Azure SQL系列数据库,这类环境原生支持
STRING_SPLIT函数 - 如果你的
Invoice字段是数值类型,遇到隐式类型转换报错时,可以把拆分后的值做显式类型转换,将子查询里的TRIM(value)替换为CAST(TRIM(value) AS INT)即可 - 按照你给出的样例数据运行上述SQL,会返回表1中
Invoice为1234、6666的两条记录,这两个编号存在于表2的逗号分隔发票列表中,其余表1记录不会被匹配到。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

