Совместимый SQL для проверки не пустых и не пустых строк - PullRequest
22 голосов
/ 23 июня 2011

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

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

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

column <> ''

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

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

len(column) > 0

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

Ответы [ 4 ]

39 голосов
/ 24 июня 2011

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, как и ожидалось.

8 голосов
/ 24 июня 2011

Как насчет

CASE WHEN column = '' THEN NULL ELSE column END IS NOT NULL
1 голос
/ 23 июня 2011

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

0 голосов
/ 24 июня 2011

Попытка сократить ответ @ 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 ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...