2016-10-04 21 views
1

私は以下の表を持っている:Where句で空文字?

CREATE TABLE SOAUDIT 
    (SOU_USER CHAR(8 BYTE), 
    SOU_ORDREF CHAR(8 BYTE), 
    SOU_TYPE CHAR(1 BYTE), 
    SOU_DESC CHAR(50 BYTE)) 

最初の3つの列に定義された一意のインデックス(私たちが制御することはできません何かあるなし主キーは、)があります。

、テーブル内のいくつかのレコードがあります。ユーザーのためにSOU_ORDREFの値「プルーストは」8文字の空の文字列であることが表示されます精密検査で

| SOU_USER | SOU_ORDREF | SOU_TYPE | SOU_DESC   | 
|----------|------------|----------|------------------| 
| proust |   | S  | recherche  | 
| joyce | 12345678 | S  | pelurious  | 
| orwell | 19841984 | T  | doubleplusungood | 
| camus | 34598798 | P  | peiner   | 

私ができる必要があることは、SQL Serverデータベースから受信する(ちょうど問題を複雑にするだけです)独自の値に基づいてこのテーブルをクエリすることです.SOU_ORDREFの場合、空白のフィールドになります。これは私が探していますレコードを返さない

SELECT * 
FROM SOAUDIT 
WHERE (SOU_USER, TRIM(SOU_ORDREF), SOU_TYPE) 
IN (('proust', null, 'S')) 

を私は次のように問合せをリライトする場合:

SELECT * 
FROM SOAUDIT 
WHERE (SOU_USER, SOU_TYPE) 
IN (('proust', 'S')) 
AND TRIM(sou_ordref) is null 

その後、私はを実行してを取得します。

しかし、私はWHERE句に複数のレコードを渡したいので、2番目のバージョンは本当に助けになりません。

+1

8文字の空の文字列がnullではありません... '' '(8スペース)を試しましたか? – JohnHC

+0

はい、しました。出来た。しかし、プロダクションでは、フィルタリングするレコードには、このような値の空の文字列が含まれます。 –

答えて

3

オラクルよりも異なるので - デフォルトでは、 - 同じものとして空の文字列とNULLを扱います。

これは、NULLとの比較がほとんど真を返すことがないため、扱いにくいことがあります。したがって、where sou_ordref = ''のような単純な式は、where sou_ordref = NULLと等価であるため、trueを返しません。これはスペースと空の文字列(NULL)を置き換えること

SELECT * 
FROM SOAUDIT 
WHERE (SOU_USER, COALESCE(TRIM(SOU_ORDREF), ' '), SOU_TYPE) IN 
      (('proust', ' ', 'S')) 

注:

は、ここに1つの回避策です。次に、結果をスペースと比較します。

+0

ありがとう - それは私のために働いて、ブートに役立つ説明。 –

0

この方法を試してみてください:

SELECT * 
FROM test 
WHERE SOU_USER = 'proust' 
AND SOU_TYPE = 'S' 
AND TRIM(sou_ordref) = '' 

空のcharがNULL

+0

この場合、検索条件として複数のレコードを使用できます。 –