我有下一个查询:
SELECT c.client_code, a.account_num, m.account_close_date, u.uso, m.product_name
FROM accounts a INNER JOIN Clients c ON c.id = a.client_id INNER JOIN
Uso u ON c.uso_id = u.uso_id INNER JOIN Magazine m ON a.account_id = m.account_id
我需要将product_name与输入参数进行比较。
product_name和输入参数@s是逗号分隔的字符串。 我使用下一个拆分功能:
ALTER FUNCTION [dbo].[Split]
(
@s VARCHAR(max),
@split CHAR(1)
)
RETURNS @temptable TABLE (items VARCHAR(MAX))
AS
BEGIN
DECLARE @x XML
SELECT @x = CONVERT(xml,'<root><s>' + REPLACE(@s,@split,'</s><s>') + '</s></root>');
INSERT INTO @temptable
SELECT [Value] = T.c.value('.','varchar(20)')
FROM @X.nodes('/root/s') T(c);
RETURN
END;
我认为我需要检查表格的交集,我将在分割product_name之后和输入参数分割后收到这些表格。我试图这样做:
WHERE (select * from dbo.Split(m.product_name, ';')
INTERSECT select * from dbo.Split('product1;product2',';'))
is not null
但它不能正常工作。求你帮帮我。
答案 0 :(得分:1)
INTERSECT需要相同的列输出,并且像UNION或EXCEPT一样使用:不在WHERE子句中
刚加入udf
...
INNER JOIN
Magazine m ON a.account_id = m.account_id
INNER JOIN
dbo.Split(@parameter, ';') CSV ON m.productname = CSV.items
如果您需要拆分m.productname
,如果无法修复设计,请使用CROSS APPLY
...
INNER JOIN
Magazine m ON a.account_id = m.account_id
CROSS APPLY
dbo.Split(m.productname, ';') WTF
INNER JOIN
dbo.Split(@parameter, ';') CSV ON WTF.items = CSV.items
但是,如果@parameter具有重复值,则JOIN和INTERSECT会给出不同的结果。例如,将DISTINCT添加到UDF以解决此问题。或者将udf JOIN更改为EXISTS