OracleデータベースとMicrosoft SQLサーバーの両方に互換性のあるSQLが必要です。
Nullではなく空の文字列に対してtrueを返す互換性のあるSQL式が必要です。
私が使用する場合:
column <> ''
microsoft SQLサーバーでは機能しますが、Oracleデータベースでは機能しません(Oracleでは ''がnullであるため)
私が使用する場合:
len(column) > 0
microsoft SQLサーバーでは動作しますが、Oracleデータベースでは動作しません(length()を使用するため)
NULLIF
は、Oracle( doc )とSQL Server(- doc )の両方で使用できます。この式は機能するはずです:
NULLIF(column, '') IS NOT NULL
両方のサーバーで、column
がNULL
の場合、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
を返します。
どう?
CASE WHEN column = '' THEN NULL ELSE column END IS NOT NULL
ここでのキーは、空の文字列が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は同じものを評価するため、タスクは簡単です。
@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 )