Eagle32 Ответов: 2

PL SQL сравнение с нулевыми значениями


Привет,

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

ПРОДУКТЫ

- КОД ПРОДУКТА
- НАЗВАНИЕ ПРОДУКТА
- PRODUCT_DESC
- КОД ИЗДЕЛИЯ
- ВИД ПРОДУКЦИИ

Таким образом, значения кода продукта и типа продукта могут быть нулевыми. В идеальном сценарии я хотел бы, чтобы эти столбцы всегда были заполнены, но, к сожалению, это не так, и это выходит из-под моего контроля.

Во-первых, пользователь предоставляет список кодов продуктов, и один из них имеет значение "неизвестно". я хочу использовать это значение и сравнить его со столбцом Product_Code, где значение для этого столбца равно NULL

Во-вторых, пользователь предоставляет список типов продуктов, и одно из значений "неизвестно", и я пытаюсь сопоставить его с нулевым значением также и для этого столбца.

Есть идеи, как я мог бы этого добиться? Я ценю конструктивную обратную связь с примерами.

Что я уже пробовал:

Я попытался построить запрос, чтобы сделать то, что я хочу, но я считаю, что мне что-то не хватает в запросе, и я не знаю, что я пропустил:

В настоящее время вот мой SQL, который я использую, но он не возвращает желаемых результатов:

SELECT PRODUCT_ID, NVL(PRODUCT_CODE, 'UNKNOWN'), NVL(PRODUCT_TYPE, 'UNKNOWN')
from PRODUCTS where PRODUCT_CODE IN('ABGC', '89ABHS', 'UNKNOWN') and PRODUCT_TYPE in('BEDDING','UNKNOWN','SPORTSWEAR')

2 Ответов

Рейтинг:
1

Eagle32

Я заставил это работать, изменив свой запрос на этот:

SELECT COALESCE(PRODUCT_CODE,'UNKNOWN') as PRODUCT_CODE,
COALESCE(PRODUCT_TYPE, 'UNKNOWN') as PRODUCT_TYPE
FROM PRODUCTS
WHERE COALESCE(PRODUCT_CODE,'UNKNOWN')
IN ('ABGC','89ABHS','UNKNOWN') AND
COALESCE(PRODUCT_TYPE, 'UNKNOWN') IN ('BEDDING','UNKNOWN','SPORTSWEAR');


Надеюсь, это поможет любому, кто попытается сделать что-то подобное мне.


Рейтинг:
0

Wendelius

С помощью COALESCE это один из вариантов и прекрасно работает до тех пор, пока вы выбираете значение, которое не может существовать в исходных данных. В противном случае вы можете получить ложные результаты, в зависимости от логики.

Другой вариант (возможно, типичный способ) заключается в использовании IS [NOT] NULL реляционный оператор. Если вы хотите включить NULL значения тогда что-то вроде

SELECT COALESCE(PRODUCT_CODE,'UNKNOWN')  AS PRODUCT_CODE,
       COALESCE(PRODUCT_TYPE, 'UNKNOWN') AS PRODUCT_TYPE
FROM PRODUCTS
WHERE (  PRODUCT_CODE IN IN ('ABGC','89ABHS')
      OR PRODUCT_CODE IS NULL) 
AND   (  PRODUCT_TYPE IN ('BEDDING','SPORTSWEAR')
      OR PRODUCT_TYPE IS NULL);

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


Eagle32

Мика, что касается вашего комментария " отлично работает до тех пор, пока вы выбираете значение, которое не может существовать в исходных данных. В противном случае вы можете получить ложные результаты, в зависимости от логики" не могли бы вы подробнее остановиться на этом, пожалуйста? Спасибо

Wendelius

Рассмотрим ситуацию, когда исходные данные будут содержать значение "неизвестно" для кода продукта. Ваш код опирается на тот факт, что UNKNOWN не найден в исходных данных, и это значение всегда генерируется из-за NULL.

Теперь, если бы "неизвестный" внезапно появился в исходных данных, вы бы ложно интерпретировали его так же, как NULL, поскольку вы преобразуете NULL в текст UKNOWN. В таком случае ваш код вернет все строки, имеющие код продукта
- ABGC
- 89ABHS
- Неизвестный
- НУЛЕВОЙ

Из-за этого сравнение с IS NULL или IS NOT NULL является более безопасным, так как нет никаких предположений.