SQL select语句过滤

时间:2010-04-23 17:41:40

标签: sql sql-server sql-server-2008

好的,所以我试图从保存值为3的列中选择一定数量的行,但仅当没有包含10或4的行时,如果有包含10或4的行,我只想显示那些。

这样做会有什么好的语法?到目前为止,我一直在尝试CASE WHEN声明,但我似乎无法弄明白。

非常感谢任何帮助。

(我的数据库位于MS SQL 2008服务器中)

4 个答案:

答案 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

运行两个查询似乎“不优雅”,但它有优势:

  • 编码很容易
  • 调试简单
  • 它通常比非常复杂的解决方案具有更好的性能
  • 对于需要在您之后维护代码的程序员来说,这很容易理解。

运行两个查询似乎有额外的开销,但也考虑到每次都不会运行第二个查询 - 仅当第一个查询的结果为空时。如果您使用昂贵的单一查询解决方案,请记住每次都会产生费用