web-dev-qa-db-ja.com

NULLではなく、空でない文字列をテストするための互換性のあるSQL

OracleデータベースとMicrosoft SQLサーバーの両方に互換性のあるSQLが必要です。

Nullではなく空の文字列に対してtrueを返す互換性のあるSQL式が必要です。

私が使用する場合:

column <> ''

microsoft SQLサーバーでは機能しますが、Oracleデータベースでは機能しません(Oracleでは ''がnullであるため)

私が使用する場合:

len(column) > 0

microsoft SQLサーバーでは動作しますが、Oracleデータベースでは動作しません(length()を使用するため)

22
Eduardo

NULLIFは、Oracle( doc )とSQL Server(- doc )の両方で使用できます。この式は機能するはずです:

NULLIF(column, '') IS NOT NULL

両方のサーバーで、columnNULLの場合、NULLIFの出力はNULL値をそのまま渡します。 SQL Serverでは、'' = ''であるため、NULLIFの出力はNULLになります。 Oracleでは、''はすでにNULLであるため、パススルーされます。

これは、SQL Server 2008 R2 Expressでの私のテストです。

WITH SampleData AS
    (SELECT 1 AS col1, NULL AS col2
     UNION ALL
     SELECT 2, ''
     UNION ALL
     SELECT 3, 'hello')
SELECT *
  FROM SampleData
 WHERE NULLIF(col2, '') IS NOT NULL;

そして、これはOracle 10g XEでの私のテストケースです:

WITH SampleData AS
    (SELECT 1 AS col1, NULL AS col2 FROM DUAL
     UNION ALL
     SELECT 2, '' FROM DUAL
     UNION ALL
     SELECT 3, 'hello' FROM DUAL)
SELECT *
  FROM SampleData
 WHERE NULLIF(col2, '') IS NOT NULL;

両方とも期待どおり3を返します。

39

どう?

CASE WHEN column = '' THEN NULL ELSE column END IS NOT NULL
8
Gary Myers

ここでのキーは、空の文字列がNULLと等しい場合とそうでない場合を区別することだと思います。

WHERE CASE WHEN '' = '' THEN -- e.g., SQL Server this is true
              CASE WHEN col <> '' AND col IS NOT NULL THEN 'Y'
                   ELSE 'N'
              END
           WHEN COALESCE(col,NULL) IS NOT NULL THEN 'Y' -- Not SS, e.g., Oracle
           ELSE 'N'
      END = 'Y';

最初のケースがtrueの場合、空の文字列はnullと同じではないため、文字列がnullでないことと文字列が空の文字列でないことをテストする必要があります。それ以外の場合、空の文字列とnullは同じものを評価するため、タスクは簡単です。

1
DCookie

@DCookieの答えを短くしてみてください。私は彼の( '' = '' )テスト。

CASE WHEN ( '' = '' ) THEN ( column <> '' )
                      ELSE ( column = column )
END

悲しいことに、上記は機能しません。次はSQL-Serverで動作します。私は今Oracleでテストできません:

CASE WHEN  '' = ''  THEN CASE WHEN column <> ''    THEN 1 ELSE NULL END 
                    ELSE CASE WHEN column = column THEN 1 ELSE NULL END 
END

次のように書くこともできます。

    ( '' = ''    AND column <> '' )
 OR ( '' IS NULL AND column = column ) 
0
ypercubeᵀᴹ