Проблема с возвратом данных с использованием SQL при сопоставлении с нулевыми значениями

#sql #oracle

#sql #Oracle

Вопрос:

Я работаю с таблицей, которая была предоставлена мне:

INP_PRODUCTS

  • INP_ID
  • INP_PRODUCT_NAME
  • INP_PRODUCT_DESC
  • INP_PRODUCT_CODE
  • INP_PRODUCT_TYPE

Таким образом, значения столбцов INP_PRODUCT_CODE и INP_PRODUCT_TYPE могут быть нулевыми. Я пытаюсь создать запрос, в котором, если конечный пользователь предоставляет значение «UNKNOWN» в отношении ProductCode, я хотел бы сопоставить нулевое значение этого столбца. Пользователь предоставляет несколько ProductCodes в качестве входного параметра.

Во-вторых, если пользователь предоставляет список типов продуктов, а одно из значений «НЕИЗВЕСТНО», тогда я хотел бы сопоставить значение null для этого столбца.

Ниже приведен SQL, который я создал, но результаты отображаются не так, как ожидалось. Я знаю, что этот запрос неверен. Я признателен, если кто-нибудь может указать мне правильное направление:

 SELECT INP_PRODUCT_ID, NVL(INP_PRODUCT_CODE, 'UNKNOWN'),   NVL(INP_PRODUCT_TYPE, 'UNKNOWN')
from INP_PRODUCTS where INP_PRODUCT_CODE IN('ABC', 'UNKNOWN', 'UUU') and INP_PRODUCT_TYPE in('CONSOLE','UNKNOWN','KITCHENAPPLIANCE')
 

Я ценю конструктивный вклад, пожалуйста, по вышеуказанному.

С уважением,

ОБНОВЛЕНИЕ относительно вышеизложенного!

Я заставил его работать, изменив мой запрос, в частности, мое предложение where:

 SELECT COALESCE(INP_PRODUCT_CODE,'UNKNOWN') as INP_PRODUCT_CODE,
COALESCE(INP_PRODUCT_TYPE, 'UNKNOWN') as INP_PRODUCT_TYPE
FROM INP_PRODUCTS
WHERE COALESCE(INP_PRODUCT_CODE,'UNKNOWN')
IN ('ABC','UNKNOWN', 'UUU') AND COALESCE(INP_PRODUCT_TYPE, 'UNKNOWN') IN('CONSOLE','UNKNOWN','KITCHENAPPLIANCE');
 

Если вы считаете, что мой приведенный выше запрос не совсем правильный, пожалуйста, ответьте на мой вопрос и предоставьте мне обратную связь.

Спасибо!

Комментарии:

1. Вы хотите изменить его значение только на ‘UNKNOWN’ или также вернуть кортеж?

2. Возможно, вы имели в виду WHERE (COALESCE(INP_PRODUCT_CODE,'UNKNOWN'),COALESCE(INP_PRODUCT_TYPE, 'UNKNOWN')) IN (('ABC','CONSOLE'),('UNKNOWN','UNKNOWN'),('UUU','KITCHENAPPLIANCE'))

Ответ №1:

Предложение COALESCE возвращает первое выражение non_null из списка выражений. См.: https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm

Если у вас есть только 1 столбец, проверьте, является ли он нулевым или нет, затем используйте инструкцию NVL. Используйте COALESCE, если вы хотите проверить больше столбцов, если они равны null или not.

 SELECT nvl(INP_PRODUCT_CODE,'UNKNOWN') as INP_PRODUCT_CODE,
       nvl(INP_PRODUCT_TYPE, 'UNKNOWN') as INP_PRODUCT_TYPE
FROM INP_PRODUCTS
WHERE nvl(INP_PRODUCT_CODE,'UNKNOWN')IN ('ABC','UNKNOWN', 'UUU') ---> if you also want de prod-codes ABC and UUU
AND   nvl(INP_PRODUCT_TYPE, 'UNKNOWN') IN ('CONSOLE','UNKNOWN','KITCHENAPPLIANCE');  ---> if you also want the types console and kitchenappliance