#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