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

Edu*_*rdo 22 sql sql-server oracle

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

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

如果我使用:

column <> ''
Run Code Online (Sandbox Code Playgroud)

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

如果我使用:

len(column) > 0
Run Code Online (Sandbox Code Playgroud)

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

Che*_*vel 39

NULLIF可在Oracle(doc)和SQL Server(doc)上使用.这个表达式应该有效:

NULLIF(column, '') IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

在两个服务器中,如果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;
Run Code Online (Sandbox Code Playgroud)

这是我在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;
Run Code Online (Sandbox Code Playgroud)

两者都3按预期回归.


Gar*_*ers 8

怎么样

CASE WHEN column = '' THEN NULL ELSE column END IS NOT NULL
Run Code Online (Sandbox Code Playgroud)