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