我有一个基本的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:
见我的博客此项:
如果您@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?