首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQL条件句

TSQL条件句
EN

Stack Overflow用户
提问于 2014-08-07 00:54:01
回答 3查看 75关注 0票数 1

我想在我的专栏上查个位置.

代码语言:javascript
复制
Where [Location 1] IN(@Brooklyn , @Queens)

但是如果没有指定位置,我想做这样的事情.

代码语言:javascript
复制
Where [Location 1]  = [Location 1]

换句话说,如果没有指定位置,我希望返回所有行。

这就是我到目前为止尝试过的& works...there必须是一种更好的方法。

代码语言:javascript
复制
Declare @Queens varchar(100)
Set @Queens = 'Queens'
Declare @Brooklyn varchar(100)
Set @Brooklyn = 'Brooklyn'

select * from AIDE_AVAILABILITY_REPORT 
where 
(
[LOCATION 1] = (Case When @Brooklyn is Not NULL Then 'Brooklyn' End) OR
[LOCATION 2] = (Case When @Brooklyn is Not NULL Then 'Brooklyn' End) OR

[LOCATION 1] = (Case When @Brooklyn is Null Then [LOCATION 1] End) OR
[LOCATION 2] = (Case When @Brooklyn is Null Then [LOCATION 2] End)

)
AND
(
[LOCATION 1] = (Case When @Queens is Not NULL Then 'Queens' End) OR
[LOCATION 2] = (Case When @Queens is Not NULL Then 'Queens' End) OR

[LOCATION 1] = (Case When @Queens is Null Then [LOCATION 1] End) OR
[LOCATION 2] = (Case When @Queens is Null Then [LOCATION 2] End)
)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-07 01:48:57

CASE表达式中,确保使用ELSE部件,而不是让它默认为NULL。这将为每组节省一行:

代码语言:javascript
复制
where 
(
[LOCATION 1] = (Case When @Brooklyn is Not NULL Then 'Brooklyn' ELSE [LOCATION 1] End) OR
[LOCATION 2] = (Case When @Brooklyn is Not NULL Then 'Brooklyn' ELSE [LOCATION 2] End)
)
AND
(
[LOCATION 1] = (Case When @Queens is Not NULL Then 'Queens' ELSE [LOCATION 1] End) OR
[LOCATION 2] = (Case When @Queens is Not NULL Then 'Queens' ELSE [LOCATION 2] End)
)

我会重新考虑你的变数。与其用每个区的名称命名变量,不如用一个带有区号的变量来命名:

代码语言:javascript
复制
WHERE [LOCATION 1] = (CASE WHEN @borough IS NULL THEN [LOCATION 1] ELSE @borough END) OR
      [LOCATION 2] = (CASE WHEN @borough IS NULL THEN [LOCATION 2] ELSE @borough END)
票数 1
EN

Stack Overflow用户

发布于 2014-08-07 02:08:30

您可能需要考虑这样的方法:

代码语言:javascript
复制
if object_id('Locations') is not null drop table Locations

Create table Locations 
(
    location nvarchar(100) 
)

insert into Locations values('Brooklyn')
insert into Locations values('Queens')
insert into Locations values('Manhattan')
insert into Locations values('Bronx')
insert into Locations values('Staten Island')


Declare @locationlookup table 
(
    location nvarchar(100)
)

Declare @locations nvarchar(max)
Set @locations = ',Brooklyn,Queens,' 

if @locations <> '' 
    insert into @locationlookup 
        select location 
            from Locations 
                        where charindex(',' + location + ',', @locations) > 0  
else 
    insert into @locationlookup select location from Locations

select * from 
    AIDE_AVAILABILITY_REPORT a, @locationlookup b  
    where 
        a.location1 = b.location
        OR a.location2 = b.location         
票数 2
EN

Stack Overflow用户

发布于 2014-08-07 02:22:16

每当我看到这样的问题时,我就会这样使用ISNULL:

代码语言:javascript
复制
SELECT * FROM AIDE_AVAILABILITY_REPORT 
WHERE ISNULL([Location 1],@Brooklyn) IN (@Brooklyn,@Queens) 
   OR ISNULL([Location 2],@Brooklyn) IN (@Brooklyn,@Queens) 

但是,您似乎认为变量可能为null (考虑到您的示例),我会这样做:

代码语言:javascript
复制
SELECT * FROM AIDE_AVAILABILITY_REPORT 
WHERE [Location 1] IN (ISNULL(@Brooklyn,[Location 1],ISNULL(@Queens,[Location 1])
   OR [Location 2] IN (ISNULL(@Brooklyn,[Location 1],ISNULL(@Queens,[Location 1])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25172615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档