2

これが私がやろうとしていることです:

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

上記の 4 つの列が 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

すべての列が null でないかどうかを確認するには:

  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

私の理解が正しければ、4 つの列すべてが null でないレコードを返したいですか?

これを行うための標準的で(私の意見では)最も読みやすい方法は次のとおりです。

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

COALESCE関数を使用して、すべての列の値が NULL かどうかを判断できます。

COALESCE 関数は、1 つ以上の引数を取り、null 以外の最初の引数を返します。COALESCE に渡された引数の少なくとも 1 つが NOT 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
-- 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 に答える