Выражение CASE со значением NULL

Я изо всех сил пытаюсь понять, как проверить нулевое значение в выражении прогресса. Я хочу увидеть, существует ли столбец, и использовать его, если не использовать резервный столбец. Например, Уильям в имени будет перезаписан Биллом в fn.special-char.

У меня есть следующий запрос:

SELECT  
"PUB"."NAME"."LAST-NAME" as LastName,
   CASE fn."SPECIAL-CHAR"
     WHEN   is null  THEN "PUB"."NAME"."FIRST-NAME"
     ELSE   fn."SPECIAL-CHAR"
END as FirstName

FROM "PUB"."NAME"  
LEFT OUTER JOIN "PUB"."DAT-DATA" fn on "PUB"."NAME"."NAME-ID" = fn."DAT-SRC-ID" and 11 = fn."FLD-FIELD-ID" 

Когда я запускаю запрос, я получаю:

Драйвер ORBC Progress OpenEdge Wire Protocol][OPENEDGE]Синтаксическая ошибка SQL-оператора в или около того "значит null, затем "PUB"."NAME"."FIRST-" (10713)

Если я делаю select *, я вижу все. Ему просто не нравится нулевая часть. Я также могу изменить значение параметра when is null на значение 'bob', и это сработает.

Есть ли что-то другое, что мне нужно сделать, чтобы использовать нулевое значение в запросе Progress db?


person Zonus    schedule 31.08.2015    source источник
comment
Выражение случая, а не утверждение...   -  person jarlh    schedule 01.09.2015


Ответы (2)


Сокращенный вариант оператора case (case expression when value then result ...) — это сокращение для ряда условий равенства между выражением и заданными значениями. null, однако, не является значением - это его отсутствие, и его необходимо явно оценивать с помощью оператора is, как вы пытались сделать. Однако, чтобы сделать это правильно, вам нужно использовать немного более длинный вариант синтаксиса casecase when condition then result ...:

SELECT  
"PUB"."NAME"."LAST-NAME" as LastName,
   CASE WHEN fn."SPECIAL-CHAR" IS NULL THEN "PUB"."NAME"."FIRST-NAME"
     ELSE   fn."SPECIAL-CHAR"
END as FirstName

FROM "PUB"."NAME"  
LEFT OUTER JOIN "PUB"."DAT-DATA" fn on "PUB"."NAME"."NAME-ID" = fn."DAT-SRC-ID" and 11 = fn."FLD-FIELD-ID" 
person Mureinik    schedule 31.08.2015
comment
Это немного многословно для варианта использования подстановки значений NULL: Coalesce() более идиоматичен для PostgreSQL. - person David Aldridge; 01.09.2015
comment
Прогресс — это не Postgres ;) - person Tom Bascom; 01.09.2015
comment
COALESCE, похоже, существует и для Progress. И это намного чище, особенно когда у вас есть более одного значения, которое «проваливается» при нулевом значении. documentation.progress.com/output/ ua/OpenEdge_latest/ - person gnud; 30.05.2018

Вместо CASE можно использовать IFNULL. функция в Progress 4GL.

SELECT  
"PUB"."NAME"."LAST-NAME" as LastName,
   IFNULL(fn."SPECIAL-CHAR", "PUB"."NAME"."FIRST-NAME") as FirstName

FROM "PUB"."NAME"  
LEFT OUTER JOIN "PUB"."DAT-DATA" fn on "PUB"."NAME"."NAME-ID" = fn."DAT-SRC-ID" and 11 = fn."FLD-FIELD-ID" 
person Anup Agrawal    schedule 31.08.2015
comment
IFNULL не является SQL-функцией PostgreSQL. - person David Aldridge; 01.09.2015
comment
@DavidAldridge Это Progress, а не PostgreSQL. progress4gl.com en.wikipedia.org/wiki/OpenEdge_Advanced_Business_Language - person Anup Agrawal; 01.09.2015
comment
IFNULL — это функция ODBC, поддерживаемая механизмом OpenEdge SQL-92, а не функция или оператор 4gl. (Существует также эквивалентное расширение Progress OpenEdge SQL-92: NVL( ‹выражение›, ‹значение› ), если вы не используете ODBC.) - person Tom Bascom; 01.09.2015
comment
Спасибо, @TomBascom OPENQuery в SQLServer использует соединение ODBC со связанным сервером, что может быть причиной того, что IFNULL сработало. - person Anup Agrawal; 01.09.2015
comment
Я бы использовал COALESCE, а не IFNULL. documentation.progress.com/output/ ua/OpenEdge_latest/ - person gnud; 30.05.2018