2

这是我正在尝试做的事情:

select * from table
where in ('completedDate', 'completedBy', 'cancelDate', 'cancelBy') is not null

如果上面的四列不为空,我需要显示记录。我知道我会用几个 where/and 子句来做到这一点,但我会努力学习并使我的新东西更干净。

我想以更清洁的方式做上面的事情吗?

4

5 回答 5

6

如果我理解正确,我猜你想这样做:

select * 
from table
where completedDate is not null
  and completedBy is not null
  and cancelDate is not null 
  and cancelBy is not null

关于代码的清晰度,我没有看到更好的编写方法,这就是我要编写的代码。

编辑:在这种情况下我不会真的这样做,但如果这是一个非常常见的情况,您可以在表中添加一个计算列(存储或不存储),或者在表顶部创建一个视图,然后执行:

select * from view where importantFieldsAreNotNull = 1
于 2013-07-08T22:06:33.377 回答
2

检查所有列是否不为空:

  select * from table 
  where completedDate is not null
  and completedBy is not null
  and cancelDate is not null 
  and cancelBy is not null
于 2013-07-08T22:04:13.293 回答
2

您可以使用COALESCE函数来确定所有列值是否为 NULL。

COALESCE 函数接受 1 个或多个参数并返回第一个非空参数。如果传递给 COALESCE 的至少一个参数不是 NULL,那么它将返回该值,否则如果所有参数都是 NULL,则返回 NULL。

SELECT * 
FROM TABLE
WHERE COALESCE(Column1, Column2, Column3, Column4) IS NOT NULL

此外,根据列的数据类型,您可能必须将它们转换为相同的数据类型。例如,我无法在没有强制转换的情况下在 DateTime 列和 CHAR 列上使用 COALECSE 函数。

但是,即使这会更短,我也不会认为它“更干净”。与 WHERE 子句中的多个 AND 相比,我认为它更难阅读和维护。

于 2013-07-08T22:20:24.417 回答
2

如果我理解正确,您想返回所有四列都不为空的记录吗?

执行此操作的标准和(在我看来)最易读的方法是:

Select
    *
From
    YourTable
Where
    Column1 IS NOT NULL AND
    Column2 IS NOT NULL AND
    Column3 IS NOT NULL AND
    Column4 IS NOT NULL;
于 2013-07-08T22:12:40.343 回答
2
-- Under reasonable assumption on data types:
select *
from [table]
where completedBy+cancelBy+DATENAME(yy,completedDate)+ DATENAME(yy,cancelDate) 
is not null
于 2013-07-09T12:57:22.307 回答