Where子句基于SQL Server中的null和非null列

时间:2013-11-05 04:51:06

标签: sql sql-server

ID | col1 | col2
-------------------------
1  | val1 | val2    
2  | val1 | null
3  | val1 | val3
4  | val5 | null

客户端将始终传递有效的col1和col2值以选择表格中可能不存在col2的单行。因此,如果col2可用,则它应返回带有col2的行,否则返回包含col2 = null和col1

的行
return  ID = 2  if col1 = val1 and col2 = val10 
return ID = 3 if col1 = val1 and col2 = val3 

如何通过单个SQL查询来实现这一目标?

2 个答案:

答案 0 :(得分:1)

这会奏效。如果没有top 1,查询可能会选择2行,所以我命令它返回col2首先不为null的那一行。

select top 1 * from table1 
where col1 = @param1 and (col2 is null or col2 = @param2)
order by case when col2 is null then 1 else 0 end

答案 1 :(得分:1)

select * from table1 where col1 = @col1 and col2 = @col2
union
select * from table1 as t where col1 = @col1 and col2 is null
and not exist (select * from table1 as c where c.col1 = t.col1 and c.col2 = @col2)

我不确定前1的解决方案是否更快,有时订购非常慢。