Подтвердить что ты не робот

Совместимый SQL для проверки не нулевой, а не пустой строки

Я хочу иметь совместимый SQL для базы данных Oracle и сервера Microsoft SQL.

Я хочу совместимое выражение SQL, которое вернет true для не нулевых, а не пустых строк.

Если я использую:

column <> ''

он будет работать на сервере Microsoft SQL, но не в базе данных Oracle (поскольку "для Oracle является null" )

Если я использую:

len(column) > 0

он будет работать на сервере Microsoft SQL, но не в базе данных Oracle (поскольку он использует length())

4b9b3361

Ответ 1

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, CAST(NULL AS varchar(10)) 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, как ожидалось.

Ответ 2

Как насчет

CASE WHEN column = '' THEN NULL ELSE column END IS NOT NULL

Ответ 3

Я думаю, что ключ здесь состоит в том, чтобы различать случай, когда пустая строка эквивалентна 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, пустая строка не совпадает с нулевой, и мы должны проверить, что обе строки не являются нулевыми, а строка не является пустой строкой. В противном случае наша задача проще, потому что пустая строка и нуль оцениваются одинаково.

Ответ 4

Попробуйте сократить @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 )