我有一个在许多不同服务器上运行的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为条件?
感谢您的帮助。
答案 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))