试图创建更干净的SQL语法

时间:2013-07-08 21:56:57

标签: sql sql-server tsql

以下是我要做的事情:

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

如果上面的四列不是null,我需要显示记录。我知道我会用几个where /和子句来做这个,但是试着学习并让我的新东西更清洁。

我正在尝试以更清洁的方式做到这一点吗?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

检查所有列是否都为空:

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

答案 2 :(得分:2)

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

标准和(在我看来)最可读的方式是:

Select
    *
From
    YourTable
Where
    Column1 IS NOT NULL AND
    Column2 IS NOT NULL AND
    Column3 IS NOT NULL AND
    Column4 IS NOT NULL;

答案 3 :(得分:2)

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

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

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

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

然而,即使这会更短,我也不会认为它“更清洁”。我认为与WHERE子句中的多个AND相比,读取和维护会更难。

答案 4 :(得分:2)

-- Under reasonable assumption on data types:
select *
from [table]
where completedBy+cancelBy+DATENAME(yy,completedDate)+ DATENAME(yy,cancelDate) 
is not null