我想为Oracle数据库和Microsoft SQL服务器提供兼容的SQL。
我想要一个兼容的SQL表达式,对于非null而不是空字符串,它将返回true。
如果我使用:
column <> ''
它可以在Microsoft SQL服务器上运行,但不能在Oracle数据库上运行(因为''对于Oracle来说是空的)
如果我使用:
len(column) > 0
它可以在Microsoft SQL服务器上运行,但不能在Oracle数据库上运行(因为它使用length())
答案 0 :(得分:39)
NULLIF
。这个表达式应该有效:
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
。
答案 1 :(得分:8)
怎么样
CASE WHEN column = '' THEN NULL ELSE column END IS NOT NULL
答案 2 :(得分:1)
我认为这里的关键是区分空字符串等于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';
如果第一种情况为真,那么空字符串与null不同,我们必须测试两个字符串是否为空,字符串不是空字符串。否则,我们的任务更容易,因为空字符串和null评估相同。
答案 3 :(得分:0)
尝试缩短@ 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 )