我有一个字符串变量:“黑色,白色,黄色”。问题是我在sql中使用Where IN子句,我需要将字符串变量放入sql语句中。例如。选择* FROM Products WHERE Products.color IN(?)
如果我将字符串变量传递给sql语句,它将变为Select * FROM Products WHERE Products.color IN(“black,white,yellow”)
但是,正确的语法应该是Select * FROM Products WHERE Products.color IN(“black”,“white”,“yellow”)
我该如何克服这个?
答案 0 :(得分:1)
我们可以使用下面的函数将逗号分隔的字符串变量(“黑色,白色,黄色”)读入XML文件并加载到临时表中。
drop table #Product_Converted
CREATE TABLE #Product_Converted
(
Product NVARCHAR(20) NULL
)
declare @product varchar(max) ='black, white, yellow'
DECLARE @product1 AS XML
DECLARE @Delimiter AS CHAR(1) =','
SET @Product1 = CAST(('<X>'+REPLACE(@Product ,@Delimiter ,'</X><X>')+'</X>') AS XML)
--Get all comma separated state values to rows of a table
INSERT INTO #Product_Converted
SELECT N.value('.', 'VARCHAR(20)') AS ID FROM @Product1.nodes('X') AS T(N)
select * from #Product_Converted
最终结果将是:
Select * FROM Products WHERE Products.color IN (select product from #Product_Converted)
答案 1 :(得分:0)
您可以尝试使用FIND_IN_SET
:
SELECT *
FROM Products
WHERE FIND_IN_SET(color, 'black,white,yellow') > 0;
请注意,CSV颜色字符串中包含 no 空格。如果您的实际字符串有空格,那么您可以先在Go中删除它们,或直接从MySQL查询中删除它们。
而且,通常,不希望将CSV数据存储在SQL表中。 FIND_IN_SET
暂时解决了这个问题,但从长远来看,你应该考虑将每种颜色存储在一个单独的记录中。