好的,所以我试图从保存值为3的列中选择一定数量的行,但仅当没有包含10或4的行时,如果有包含10或4的行,我只想显示那些。
这样做会有什么好的语法?到目前为止,我一直在尝试CASE WHEN声明,但我似乎无法弄明白。
非常感谢任何帮助。
(我的数据库位于MS SQL 2008服务器中)
答案 0 :(得分:4)
使用union all
:
select
// columns
from YourTable
where YourColumn = 3 and not exists (
select 1 from YourTable where YourColumn = 10 or YourColumn = 4)
union all
select
// columns
from YourTable
where YourColumn = 10 or YourColumn = 4
答案 1 :(得分:2)
仅供参考:原始问题标题为“ SQL CASE WHEN NULL - 问题”
CASE WHEN YourColumn IS NULL THEN x ELSE y END
由于没有什么可以与NULL比较并且返回true(甚至不是NULL本身),所以你不能这样做
CASE YourColumn WHEN NULL THEN x ELSE y END
仅
CASE ISNULL(YourColumn, '') WHEN '' THEN x ELSE y END
但是你失去了区分NULL和(在这个例子中)空字符串的能力。
答案 2 :(得分:1)
根据表的大小及其索引,在查询之前计算所需的值可能更有效
declare @UseThree as bit = 1;
if exists (select 1 from testtable where rowval in (10,4))
set @UseThree = 0;
select COUNT(*)
from testtable
where (@UseThree = 1 AND rowval=3)
OR
(@UseThree = 0 AND rowval in (10,4))
答案 3 :(得分:1)
最简单的解决方案是在两个查询中执行此操作:
SELECT ... FROM YourTable WHERE SomeColumn IN (10,4)
当且仅当上述查询没有产生结果时,请运行第二个查询:
SELECT ... FROM YourTable WHERE SomeColumn = 3
运行两个查询似乎“不优雅”,但它有优势:
运行两个查询似乎有额外的开销,但也考虑到每次都不会运行第二个查询 - 仅当第一个查询的结果为空时。如果您使用昂贵的单一查询解决方案,请记住每次都会产生费用。