Совместимый SQL для проверки не нулевой, а не пустой строки
Я хочу иметь совместимый SQL для базы данных Oracle и сервера Microsoft SQL.
Я хочу совместимое выражение SQL, которое вернет true для не нулевых, а не пустых строк.
Если я использую:
column <> ''
он будет работать на сервере Microsoft SQL, но не в базе данных Oracle (поскольку "для Oracle является null" )
Если я использую:
len(column) > 0
он будет работать на сервере Microsoft SQL, но не в базе данных Oracle (поскольку он использует length())
Ответы
Ответ 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 )