如何将字符串转换为不同的子字符串并将其放入变量?

时间:2018-03-14 01:54:44

标签: mysql

我有一个字符串变量:“黑色,白色,黄色”。问题是我在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”

我该如何克服这个?

2 个答案:

答案 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;

Demo

请注意,CSV颜色字符串中包含 no 空格。如果您的实际字符串有空格,那么您可以先在Go中删除它们,或直接从MySQL查询中删除它们。

而且,通常,不希望将CSV数据存储在SQL表中。 FIND_IN_SET暂时解决了这个问题,但从长远来看,你应该考虑将每种颜色存储在一个单独的记录中。