我如何使用逗号分隔值的列表,在T-SQL的过滤器?(How do I use a comma sep

2019-07-29 04:03发布

我有一个基本的SQL查询,首先是:

SELECT top 20 application_id, [name], location_id FROM apps

现在,我想完成它,这样它这样做(用伪代码)

if @lid > 0 then
    WHERE location_id IN (@lid)
else
    WHERE location_id is all values in location_id column

按照要求,这里有一个例子

application_id             name               location_id
----------------------------------------------------------
1                          Joe Blogs          33
2                          Sam Smith          234
3                          Jeremy Carr        33

@locid是由用户给出的结果,例如'33,234'

如果@lid是空的,那么我就喜欢输出与名称和APPLICATION_ID LOCATION_ID所有行。 否则,我就喜欢输出在@lid关系所提供的号码的所有行(代表LOCATION_ID。

所以,如果@lid是0:

application_id             name               location_id
----------------------------------------------------------
1                          Joe Blogs          33
2                          Sam Smith          234
3                          Jeremy Carr        33

否则,如果@lid包含“33”

application_id             name               location_id
----------------------------------------------------------
1                          Joe Blogs          33
3                          Jeremy Carr        33

Answer 1:

尝试使用情况下 ,提供一个IIF或三元运算符的目的。 请检查该链接http://msdn.microsoft.com/en-us/library/ms181765.aspx

干杯



Answer 2:

如果@locid是一个列表,例如“33,234”等,然后在这里没有办法将工作。 不过,我想这些都与此信息您的更新之前发布。

我认为,既然你这样说:

@locid是由用户给出的结果,例如'33,234'

你不能直接扩大变量,以便location_in IN (33, 234) 你实际上是要求location_id = '33, 234' ,这将失败,因为数据类型优先与CAST转换。

你必须先解析列表转换为表格形式使用加入/ EXISTS构建。 有几个选项和厄兰涵盖他们都在这里: 数组和列表在SQL Server 2005



Answer 3:

假设@locid&@lid都是一样的 ,我要使用@locid ...以下是可行的。 我已经分裂它保持它的SO看起来很不错。

SELECT application_id, [name], location_id 
FROM apps
WHERE
  ( 
    @locid = 0
    OR 
    CHARINDEX
    ( 
      ',' + CAST(location_id AS VARCHAR(50)) + ','
      , 
      ',' + @locid + ','
      , 
      0 
    ) > 0
  )


Answer 4:

见我的博客此项:

  • 用逗号分隔的列表:SQL服务器

如果您@lid是一个逗号分隔的整数列表,使用:

WITH    cd AS
        (
        SELECT  1 AS first, CHARINDEX(',', @lid, 1) AS next
        UNION ALL
        SELECT  next + 1, CHARINDEX(',', @lid, next + 1)
        FROM    cd
        WHERE   next > 0
        ),
        lid AS
        (
        SELECT  CAST(SUBSTRING(@lid, first, CASE next WHEN 0 THEN LEN(@lid) + 1 ELSE next END - first)AS INT) AS id
        FROM    cd
        )
SELECT  d.*
FROM    (
        SELECT  DISTINCT id
        FROM    lid
        ) l
JOIN    apps a
ON      a.location_id = l.id
        AND @lid <> '0'
UNION ALL
SELECT  *
FROM    apps a
WHERE   @lid = '0'

这比使用更有效OR构造。



Answer 5:

WHERE CHARINDEX(LocationId, @lid) > 1


Answer 6:

一种方式是分割在逗号字符串,去除出空间和值插入到临时表。 然后你就可以加入你对临时表查询。

这是一个T-SQL代码段一个分割逗号分隔的列表和所述构件插入到一个临时表。 一旦你填写的表格,你可以加入反对。

-- This bit splits up a comma separated list of key columns
-- and inserts them in order into a table. 
--
if object_id ('tempdb..#KeyCols') is not null
    drop table #KeyCols

create table #KeyCols (
      ,KeyCol           nvarchar (100)
)

set @comma_pos = 0
set @len = len(@KeyCols)
while @len > 0 begin
    set @comma_pos = charindex(',', @KeyCols)
    if @comma_pos = 0 begin
        set @KeyCol = @KeyCols
        set @KeyCols = ''
    end else begin
        set @KeyCol = left (@KeyCols, @comma_pos - 1)
        set @KeyCols = substring(@KeyCols, 
                                 @comma_pos + 1, 
                                 len (@KeyCols) - @comma_pos)
    end
    insert #KeyCols (KeyCol)
    values (@KeyCol)
    set @len = len (@KeyCols)
end


Answer 7:

你并不真的需要这个三元运算符:

SELECT top 20 application_id, [name], location_id
FROM apps
WHERE (@lid > 0 AND location_id IN (@lid)) OR @lid <= 0


Answer 8:

下面应该为你做的伎俩。

DECLARE @lid SMALLINT

SET @lid = 0

SELECT TOP 20 APPLICATION_ID,[姓名],LOCATION_ID

从应用程序

WHERE((@lid> 0 AND LOCATION_ID = @lid)

  OR (@lid = 0 AND location_id > @lid))

如果@lid = 0,那么将返回所有行。 IF @lid具有特定值,则返回只为@lid值的行。



Answer 9:

虽然它是不完全使用1 = 1最佳实践,在这里做的伎俩。

SELECT top 20 application_id, [name], location_id FROM apps
WHERE
  (@lid > 0 and @lid = location_id)
or
  (isnull(@lid, 0) <= 0 and 1=1)


Answer 10:

您在这里问不同的问题。 这是回答你原来的问题(约三元运算符,但你可以看到,你不需要像这种三元操作符的任何东西):

SELECT top 20 application_id, [name], location_id 
FROM apps
WHERE @lid = 0 OR location_id IN (@lid)

但是,这是之前我们知道@lid是一个varchar,并可能包含不同的逗号分隔值。

那么,这(对CSV)是这里已经问过一个问题:

通过存储过程传递一个“在”名单
T-SQL存储过程接受多个ID值



文章来源: How do I use a comma separated list of values as a filter in T-SQL?