Невозможно вставить значение NULL в инструкцию UPDATE - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть оператор обновления, который возвращает ошибку

Невозможно вставить значение NULL в столбец 'PAYMENT_AMOUNT'; Таблица подписок

Я понимаю, что мне нужно установить столбцы, которые "не являются нулевыми", которые я, возможно, не использую, но все еще в таблице, к их значениям по умолчанию. Но я не уверен, как написать это, и мне не повезло найти примеры, которые имеют отношение.

Я боюсь, что, сказав PAYMENT_AMOUNT = default, он переопределит любой из столбцов, в которых есть данные. Общая цель моего заявления об обновлении состоит в том, чтобы обновлять только определенные столбцы в одной таблице (которые не были заполнены точно), с помощью столбцов из другой таблицы с правильными данными.

UPDATE S
SET S.PAID_THRU = CASE
                      WHEN S.PAID_THRU IS NULL THEN TRANS.PAID_THRU 
                      WHEN S.PRODUCT_CODE = '2019_NATL' AND S.PAID_THRU != '12/31/2019' THEN TRANS.PAID_THRU
                      WHEN S.PRODUCT_CODE = '2019_DIVISION' AND S.PAID_THRU != '12/31/2019' THEN TRANS.PAID_THRU
                      WHEN S.PRODUCT_CODE = '2019_REGION' AND S.PAID_THRU != '12/31/2019' THEN TRANS.PAID_THRU
                  END,
    S.PAYMENT_AMOUNT = CASE 
                          WHEN S.PAYMENT_AMOUNT = '0.00' THEN TRANS.AMOUNT
                       END,
    S.BALANCE = CASE 
                   WHEN S.BALANCE = '0.00' THEN (TRANS.AMOUNT - TRANS.AMOUNT) 
                END
FROM 
    name N
INNER JOIN
    trans ON n.ID = trans.BT_ID 
INNER JOIN
    SUBSCRIPTIONS S ON TRANS.BT_ID = s.ID
WHERE 
    member_type = 'C'
    AND join_date > '7/1/2018'
    AND trans.TRANSACTION_DATE > '7/1/2018'  
    AND n.paid_thru = '12/31/2019'
    AND trans.product_code = s.product_code
    AND trans.BT_ID = s.ID

Ответы [ 2 ]

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

Вы можете изменить свой запрос следующим образом:

UPDATE S
SET S.PAID_THRU = CASE WHEN S.PAID_THRU IS NULL or (S.PAID_THRU != n.paid_thru and S.PRODUCT_CODE in ('2019_NATL', '2019_DIVISION', '2019_REGION') then TRANS.PAID_THRU
                      else S.PAID_THRU END,
    S.PAYMENT_AMOUNT = CASE WHEN S.PAYMENT_AMOUNT = '0.00' THEN TRANS.AMOUNT ELSE S.PAYMENT_AMOUNT END,
    S.BALANCE = CASE WHEN S.BALANCE = '0.00' THEN (TRANS.AMOUNT - TRANS.AMOUNT) else S.BALANCE END

FROM name N
INNER JOIN SUBSCRIPTIONS S ON n.BT_ID = s.ID
INNER JOIN trans ON n.ID = trans.BT_ID AND trans.product_code = s.product_code AND trans.TRANSACTION_DATE > '7/1/2018'

WHERE member_type = 'C' AND join_date > '7/1/2018' AND n.paid_thru = '12/31/2019'
0 голосов
/ 14 сентября 2018

Не похоже, что у вас есть выход для вашего оператора switch.Не могли бы вы просто установить для столбца исходное значение?

S.PAYMENT_AMOUNT = CASE 
  WHEN S.PAYMENT_AMOUNT = '0.00' THEN TRANS.AMOUNT
  ELSE S.PAYMENT_AMOUNT
END

Или еще один способ сузить оператор обновления до значений, имеющих значение trans, состоял бы в проверке нуля в предложении WHERE:

AND NOT TRANS.AMOUNT IS NULL
...