Выражение SQL CASE выдает сообщение об ошибке с вычислением - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть запрос, в котором я должен сравнить сроки выполнения, и мне кажется, что мое выражение CASE не работает должным образом.

В данный момент я закомментировал исходное предложение ELSE, которое ядумал, что может сделать свое дело, но, к сожалению, он просто дает мне ошибку "Аргумент 1 функции CASE недопустим. Причина ...: Тип данных, длина или значение аргумента 1 указанной функции CASE недопустимы."

Есть идеи?Я работаю с IBM DB2.

. Желаемым результатом для предложения ELSE будет добавление даты счета-фактуры (AHINVD) и кода даты-фактуры счета (CMDDCD) для получения исходной даты-фактуры счета-фактуры.

    Select
CMCMP as CompanyCode
,CMCUS# as CustomerCode
,CMNAME as CustomerName
,CMDDCD as InvoiceDuteDateCode
,AHINV# as InvoiceNumber
,AHISEQ as InvoiceSequence
,AHINVD as InvoiceDate
,AHDUED as InvoiceDueDate
,case
    when date(to_date(RTRIM(AHINVD),'YYYYMMDD')) + cast(CMDDCD as INT) days = date(to_date(RTRIM(AHDUED),'YYYYMMDD')) then NULL
    --else date(to_date(RTRIM(AHINVD),'YYYYMMDD')) + cast(CMDDCD as INT) days
    else '12'
end as OriginalInvoiceDueDate
,AHAMT$ as OriginalAmount
,AHCURC as CurrencyCode
from WSDATARG.CUSMASFL cm
left join WSDATARG.ARIHDRFL ar
on CMCMP = AHCMP
and CMCUS# = AHCUS#
where CMCMP = '14'
and AHINVD > '20180918

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Я подозреваю, что вы используете DB2 для z / OS или DB2 для i.Если так, я подозреваю, что это не понравится нетипизированный NULL.Тренировка Db2 LUW должна быть ДАТА.например,

db2 "CREATE TABLE TEST(AHINVD CHAR(8), CMDDCD CHAR(6), AHDUED CHAR(8))"
db2 "describe 
SELECT 
case
    when date(to_date(RTRIM(AHINVD),'YYYYMMDD')) + cast(CMDDCD as INT) days = date(to_date(RTRIM(AHDUED),'YYYYMMDD')) then NULL
    else date(to_date(RTRIM(AHINVD),'YYYYMMDD')) + cast(CMDDCD as INT) days
end
FROM TEST"


 Column Information

 Number of columns: 1

 SQL type              Type length  Column name                     Name length
 --------------------  -----------  ------------------------------  -----------
 385   DATE                     10  1                                         1

, но, например, это

SELECT 
case
    when date(to_date(RTRIM(AHINVD),'YYYYMMDD')) + cast(CMDDCD as INT) days = date(to_date(RTRIM(AHDUED),'YYYYMMDD')) then CAST(NULL AS DOUBLE)
    else date(to_date(RTRIM(AHINVD),'YYYYMMDD')) + cast(CMDDCD as INT) days
end
FROM TEST

возвращает

‬‪The‬‎ ‪data‬‎ ‪types‬‎ ‪of‬‎ ‪the‬‎ ‪result‬‎-‪expressions‬‎ ‪of‬‎ ‪a‬‎ ‪CASE‬‎ ‪expression‬‎ ‪or‬‎ ‪DECODE‬‎ ‪function‬‎ ‪are‬‎ ‪not‬‎ ‪compatible‬‎.‪‬‎.‪‬‎ ‪SQLCODE‬‎=‪‬‎-‪581‬‎,‪‬‎ ‪SQLSTATE‬‎=‪42804‬‎

То, что я предполагаю, похоже на ваше сообщение Db2 для z / OS

Возможно, поскольку NULL - это то, что вы получаете, если у вас нет ELSE, почему бы просто не кодировать это?

SELECT 
case
    when  date(to_date(RTRIM(AHINVD),'YYYYMMDD')) + cast(CMDDCD as INT) days 
       <> date(to_date(RTRIM(AHDUED),'YYYYMMDD'))
    then  date(to_date(RTRIM(AHINVD),'YYYYMMDD')) + cast(CMDDCD as INT) days
end
FROM TEST
0 голосов
/ 19 сентября 2018

Попробуйте CAST(NULL AS DATE) вместо NULL в случае

DB2: Не будет разрешен столбец "NULL"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...