【问题标题】:MS SQL, see if any items in one list match items in another list [duplicate]MS SQL,查看一个列表中的任何项目是否与另一个列表中的项目匹配[重复]
【发布时间】:2016-06-21 17:25:16
【问题描述】:

我正在编写一个 SQL 存储过程。传递给存储过程的参数之一是列表(逗号分隔的字符串)。

我知道如果我想在该列表中查找特定字符串,我可以使用 SELECT * FROM myTable WHERE myField IN (@myList) 之类的东西

但是如果“myField”也包含一个列表(逗号分隔的字符串)怎么办。如何检查“@myList”是否匹配“myField”列表中的任何值?

我正在使用 SQL Server 2014 SP1,如果这有什么不同的话。

【问题讨论】:

  • 你想要一个表值参数
  • 这不是“现有问题的精确副本”。虽然建议的解决方案可能适用,但链接的问题是指从 C# 应用程序传递数据,而我的问题是在存储过程中专门处理。
  • 您可以将表从任何语言传递到存储过程,包括另一个存储过程。实际上存储过程是最快的。使用此答案中描述的解析器非常慢,并且是解决此问题的错误方法。当您的系统变慢并且您发布有关如何加快速度的问题时,请记住此评论并更改为使用表值参数。祝你好运。

标签: sql stored-procedures


【解决方案1】:

在解析器的帮助下...有很多。

Select * 
 From  myTable
 Where MyField in ( Select Key_Value from [dbo].[udf-Str-Parse](@myList,',') )

或者可以加入

Select A.* 
 From  myTable A
 Join ( Select * from [dbo].[udf-Str-Parse](@myList,',') b
   on A.MyField  = B.Key_Value

我的解析器

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@delimeter varchar(10))
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
--       Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
--       Select * from [dbo].[udf-Str-Parse]('id26,id46|id658,id967','|')

Returns @ReturnTable Table (Key_PS int IDENTITY(1,1) NOT NULL , Key_Value varchar(max))

As

Begin
   Declare @intPos int,@SubStr varchar(max)
   Set @IntPos = CharIndex(@delimeter, @String)
   Set @String = Replace(@String,@delimeter+@delimeter,@delimeter)
   While @IntPos > 0
      Begin
         Set @SubStr = Substring(@String, 0, @IntPos)
         Insert into @ReturnTable (Key_Value) values (@SubStr)
         Set @String = Replace(@String, @SubStr + @delimeter, '')
         Set @IntPos = CharIndex(@delimeter, @String)
      End
   Insert into @ReturnTable (Key_Value) values (@String)
   Return 
End

【讨论】:

  • 这似乎与 SELECT * FROM myTable WHERE myField IN (@myList) 没有任何不同的行为。它仍在查看 myField 中的列表是否包含已解析的列表。我需要查看解析列表中的任何值是否包含在 myField 列表中的任何位置。
  • 刚刚看到 MyField 可能有逗号分隔的字符串。你可以使用 like 甚至 charindex
  • 关于如何使用 LIKE 语法的任何想法。我无法解决这个问题。我试过...(Solutions LIKE (SELECT ('%'+Key_Value+'%') AS KeyValue FROM [dbo].[udf-Str-Parse](@Solutions,',')) OR @Solutions = '')但这会爆炸,因为返回了多个项目。
  • 在 A.MyField 的 ON 子句中 Like '%'+B.Key_Value+'%'
  • 我应该补充一下,您可能希望选择 Distinct 以避免重复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多