Проблема реляционных операторов с нулем - PullRequest
0 голосов
/ 06 февраля 2019

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

SELECT C.FIRST_NAME, C.LAST_NAME, B.COMPANY,A.ITEMNO, A.REV, A.DESCRIP
FROM  ARINVT A
INNER JOIN ARCUSTO B 
  ON A.ARCUSTO_ID = B.ID
INNER JOIN PR_EMP C 
  ON B.AR_PR_EMP_ID = C.ID
WHERE A.ARCUSTO_ID = B.ID AND
  B.AR_PR_EMP_ID = C.ID AND
  A.ONHAND <= 0 AND
  A.CUSER7 = 'Y' AND
  A.PK_HIDE <> 'Y'

Если я удаляю последнюю строку оператора (A.PK_HIDE <> 'Y') он собирает данные, которые я ожидаю увидеть.Столбец PK_HIDE имеет только 3 различных значения в столбце: «Y», «N» или «NULL».При удалении последней строки я выбираю набор данных, где PK_HIDE = 'N'.

Я также пробовал этот оператор:

SELECT C.FIRST_NAME, C.LAST_NAME, B.COMPANY,A.ITEMNO, A.REV, A.DESCRIP
FROM  ARINVT A
INNER JOIN ARCUSTO B 
  ON A.ARCUSTO_ID = B.ID
INNER JOIN PR_EMP C 
  ON B.AR_PR_EMP_ID = C.ID
WHERE A.ARCUSTO_ID = B.ID AND
  B.AR_PR_EMP_ID = C.ID AND
  A.ONHAND <= 0 AND
  A.CUSER7 = 'Y' AND
  A.PK_HIDE = 'N' OR A.PK_HIDE IS NULL

Этот оператор, кажется, игнорирует (A.CUSER7 = 'Y'), поскольку он извлекает все наборы данных с A.PK_HIDE = 'N' ИЛИ A.PK_HIDE IS NULL.

Любая помощь приветствуется.Заранее спасибо.

1 Ответ

0 голосов
/ 06 февраля 2019

Если вы хотите правильно управлять нулевым значением в первом запросе, вы должны использовать NVL для PK_HIDE

SELECT C.FIRST_NAME, C.LAST_NAME, B.COMPANY,A.ITEMNO, A.REV, A.DESCRIP
FROM  ARINVT A
INNER JOIN ARCUSTO B 
  ON A.ARCUSTO_ID = B.ID
INNER JOIN PR_EMP C 
  ON B.AR_PR_EMP_ID = C.ID
WHERE A.ARCUSTO_ID = B.ID 
AND B.AR_PR_EMP_ID = C.ID 
AND A.ONHAND <= 0 
AND A.CUSER7 = 'Y' 
AND NVL(A.PK_HIDE, 'N') <> 'Y'

Во втором вы должны обернуть условие для PK_HIDE в ()

SELECT C.FIRST_NAME, C.LAST_NAME, B.COMPANY,A.ITEMNO, A.REV, A.DESCRIP
FROM  ARINVT A
INNER JOIN ARCUSTO B 
  ON A.ARCUSTO_ID = B.ID
INNER JOIN PR_EMP C 
  ON B.AR_PR_EMP_ID = C.ID
WHERE A.ARCUSTO_ID = B.ID 
AND B.AR_PR_EMP_ID = C.ID 
AND A.ONHAND <= 0 
AND A.CUSER7 = 'Y' 
AND ( A.PK_HIDE = 'N' OR A.PK_HIDE IS NULL) 

если вы не используете ( A.PK_HIDE = 'N' OR A.PK_HIDE IS NULL) ваше условие «где» эквивалентно

WHERE ( A.ARCUSTO_ID = B.ID 
AND B.AR_PR_EMP_ID = C.ID 
AND A.ONHAND <= 0 
AND A.CUSER7 = 'Y' 
AND A.PK_HIDE =  ) 
OR A.PK_HIDE IS NULL

, которое явно дает неправильный результат

...