【问题标题】:How do I use a comma-separated list of values with SQL IN clause [duplicate]如何在 SQL IN 子句中使用逗号分隔的值列表 [重复]
【发布时间】:2016-01-04 20:42:12
【问题描述】:

我想在我的查询中为名称列应用 SQL IN 子句。我知道有一个选项 'like' 但是,在 UI 中,用户从多选下拉列表中选择客户的姓名,所以我有一个逗号分隔的名称列表,例如“rocky、joni、david”并使用 SQL IN 列表需要像“rocky”、“joni”、“david”。如果我的问题有什么不清楚的地方,请告诉我。

【问题讨论】:

  • 永远不要将数据存储为逗号分隔的项目,这只会给您带来很多麻烦。每行一项!
  • 总是三个值吗?可以更多吗?可以是 100 还是 1000?听起来您正在尝试生成动态 SQL,其中有一些您应该了解的陷阱。根据我上面的问题,可能有更好的方法来处理它。
  • 向我们显示查询,以便我们可以帮助我们不知道您做了什么。
  • 您使用的是哪个 dbms? (你已经得到了一个产品特定的答案,浪费人们的时间为错误的产品写答案是不公平的......)
  • sry @nvoigt 我没有提到我尝试过的东西,因为它是一个日志故事;)

标签: c# sql


【解决方案1】:

对于 MS SQL Server,您可以使用拆分函数,例如在此处找到的以下函数:https://stackoverflow.com/a/10914602/3854195

CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
RETURNS
 @returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN

 DECLARE @name NVARCHAR(255)
 DECLARE @pos INT

 WHILE CHARINDEX(',', @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX(',', @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @returnList 
  SELECT @name

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 INSERT INTO @returnList
 SELECT @stringToSplit

 RETURN
END

然后您可以使用IN,因为该函数将您的值作为表格返回。

DECLARE @CustomerList varchar(max)

/* Populate @CustomerList with your comma separated values  */

SELECT *
FROM Customers
WHERE CustomerName IN (
        SELECT [Name]
        FROM dbo.splitstring(@CustomerList)
        )

【讨论】:

  • 最好添加脚本的参考副本以防链接断开(毕竟问题和答案可能会被删除)。确保仍然包含指向源的链接。
  • 已编辑。谢谢你的建议。
  • 我会调整您从原始帖子中复制的最后一个代码示例,以便在IN 中实际使用splitstring 函数,除此之外,干得好!
  • 请指定这是用于哪个 dbms。 (没有产品标记有问题。)
  • 已编辑以指定 dbms 并显示适用的代码示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 2020-12-09
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多