兼容的SQL来测试非空字符串而不是空字符串

时间:2011-06-23 16:48:34

标签: sql sql-server oracle

我想为Oracle数据库和Microsoft SQL服务器提供兼容的SQL。

我想要一个兼容的SQL表达式,对于非null而不是空字符串,它将返回true。

如果我使用:

column <> ''

它可以在Microsoft SQL服务器上运行,但不能在Oracle数据库上运行(因为''对于Oracle来说是空的)

如果我使用:

len(column) > 0

它可以在Microsoft SQL服务器上运行,但不能在Oracle数据库上运行(因为它使用length())

4 个答案:

答案 0 :(得分:39)

Oracle(doc)和SQL Server(doc)上都提供了

NULLIF。这个表达式应该有效:

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

答案 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 )