COALESCE在SQL Server 2008中获取NULL和NOT NULL值

时间:2013-11-19 09:49:42

标签: sql-server

我在MySQL中编写了一个查询:

select RecordID, AppInstanceID, ID
 where RecordID like ? 
 and((isNull(AppInstanceID) OR AppInstanceID=  CASE  WHEN COALESCE(?,'') = ''  THEN AppInstanceID  ELSE ?  END)
 and(isNull(ID) OR ID=  CASE  WHEN COALESCE(?,'') = ''  THEN    ID  ELSE ?  END)

这给了我Null和Not Null值。

现在,我转向SQL Server 2008。

如何在SQL Server 2008中实现此合并功能。

用户可以在recordId字段中传递%,他应该获取所有数据,无论是null还是非空。

3 个答案:

答案 0 :(得分:2)

我不完全确定你的问题是什么,所以这可能是一个答案,但肯定是建议。您可以按如下方式重写where子句:

SELECT RecordID, AppInstanceID, ID
WHERE RecordID LIKE ? 
AND (AppInstanceID IS NULL OR AppInstanceID = ISNULL(?, AppInstanceID))
AND (ID IS NULL OR ID = ISNULL(?, ID)

CASE WHEN COALESCE(?,'') = '' THEN ID ELSE ? END

与写作完全相同

COALESCE(?, ID)

CASE语句完全没必要。 (COALESCE可以像我上面的代码中那样换成ISNULL

答案 1 :(得分:0)

如果你想要所有的NULL和NOT NULL值你不必在where子句中放置任何东西,只需选择你想要的列,它将返回所有值,无论thery是否为NULL或NOT NULL。
但是如果你使用Like运算符来过滤掉一些结果然后你也想要所有的NULL值你可以做这样的事情。

select RecordID, AppInstanceID, ID
WHERE RecordID like '%'
OR RecordID IS NULL

它将返回RecordID具有某些值的所有行,如您定义的值或NULL值。

答案 2 :(得分:0)

我找到了解决方案。这是它的工作原理。

select RecordID, AppInstanceID, ID
 where RecordID like ? 
 and(AppInstanceID=  CASE  WHEN COALESCE(?,'') = ''  THEN AppInstanceID  ELSE ?  END)
 and(ID=  CASE  WHEN COALESCE(?,'') = ''  THEN    ID  ELSE ?  END)

由于