条款内的条件陈述

时间:2009-11-19 15:22:01

标签: sql sql-server conditional

我有一个在许多不同服务器上运行的sproc。在sproc中,我有一个如下所示的select语句。

select *
from my_table
where id = @my_id
   and status in (1,3)

但是,对于其中一个数据库,我需要where子句的第二部分仅用于等于1的状态。所以基本上......

select *
from my_table
where id = @my_id
   and status in (1)

我真的不想给我们一个if db_name() = 'mydb'语句,因为实际的select语句要长得多,而且代码在这一点上看起来真的很不优雅。有没有办法让where子句的第二部分以db_name为条件?

感谢您的帮助。

6 个答案:

答案 0 :(得分:2)

您可以使用案例陈述

select *
from    my_table
where   id = @my_id   
and     status =    CASE 
                        WHEN db_name() = 'mydb'
                            THEN 1
                        WHEN db_name() = 'other' 
                            THEN 3
                        ELSE -1
                    END

答案 1 :(得分:1)

实际上,这将是不优雅的,因为它是有条件的。

所以,如果status IN (1, 3)表示status = 1 or status = 3 ...

where id = @my_id
   and
       (
       status = 1
       or
       (db_name() <> 'mydb' and status = 3)
       )

答案 2 :(得分:1)

创建一个新表。

select my_table.*
from my_table
inner join my_valid_statuses on my_table.status = my_valid_statuses.status
where my_table.id = @my_id

然后确保在每个数据库中正确填充my_valid_statuses

答案 3 :(得分:0)

试试这个:(我想我的逻辑是正确的......) 如果任何数据库的状态为1,那么您需要它,但只希望不是那个指定数据库的数据库的状态为3 ...

   Select ...
   Where id = @my_id  
      And (status = 1 Or 
         (Db_Name() <> @DbName And status = 3))

答案 4 :(得分:0)

这样的事情

select * 
from dbo.MyTable
where 1=1
and 
    (DB_NAME() = 'FirstDatabase' and Status in (1))
OR
    (DB_NAME() = 'SecondDatabase' and Status in (1, 3))

答案 5 :(得分:0)

有点复杂,但如果DB_NAME()有效,它就会这样做。

SELECT *
FROM my_table
WHERE id = @my_id and (status in (1) or (DB_NAME() <> 'mydb' AND status = 3))