Как я могу сравнить с возможным нулевым значением в оракуле?

Я вижу несколько вариантов этого вопроса, но все они, кажется, говорят о производительности и индексах, когда спрашивают о сравнении нулевых значений.

Моя проблема в том, что у меня есть вложенный SELECT, который может возвращать значение null, с которым я сравниваю на основе параметра даты.

SELECT a.* 
FROM Table_One a,
     Table_Two b
WHERE a.Fieldc IN (SELECT CompareValue from Table_Three cv WHERE inDate between cv.Date_ and SYSDATE)
AND a.Fielda = b.Fieldb(+)

кажется, что когда вложенный выбор здесь возвращает null, тогда левое соединение портится.

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

Спасибо за любое понимание. Спасибо.

Дальнейшая информация:

Table_One Data: все поля varchar2

Fielda | Fieldb | Fieldc|
'aVal' | 'bVal' | 'cVal'|
'dVal' | 'eVal  | 'fVal'|
'dVal' | 'fVal  | 'eVal'|

Table_Two Data: все поля varchar2

Fielda | Fieldb | Fieldc|
'aVal' | 'bVal' | 'cVal'|
'dVal' | 'fVal  | 'gVal'|
'dVal' | 'fVal  | 'cVal'|

Table_Three Data: CompareValue — это varchar2, date_ — это дата

CompareValue | date_      |
'fval'       | 2012-09-10 |

Итак, если параметр был сегодня, выбор возвращает «fval», и мы правильно получаем левое соединение. однако, когда параметр даты находится перед «2012-09-10», тогда вложенный выбор сравнивает значение null, и левое соединение не происходит должным образом. Это немного упрощенная версия оригинала.

Спасибо


person dee    schedule 11.09.2012    source источник
comment
вы хотите, чтобы оно совпадало, когда значение равно null или не соответствует?   -  person Randy    schedule 12.09.2012
comment
Из запроса мне непонятно, зачем вообще нужно левое внешнее соединение.   -  person David Faber    schedule 12.09.2012
comment
Не имеет отношения к вашему вопросу, но тем не менее: не используйте оператор (+) для внешних соединений. Используйте правильный синтаксис LEFT JOIN.   -  person a_horse_with_no_name    schedule 12.09.2012
comment
Ошибка левого соединения не очень информативна. Что именно это значит? Коды ошибок? Если подзапрос возвращает null, что вы хотите?   -  person DCookie    schedule 12.09.2012


Ответы (3)


используйте NVL(inDate, sysdate+1), чтобы не совпадать, когда ноль

person Randy    schedule 11.09.2012

Я предполагаю, что вы выбираете из таблицы a при условии, что a.Fieldc считается «активным», потому что в table_three его inDate находится между некоторой датой начала и sysdate.

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

Боюсь, я не могу дать более точный ответ, потому что вы больше не поделились информацией о своем деле.

person winkbrace    schedule 11.09.2012
comment
Базз, вы правы, я сопоставляю значение в table_three, когда оно активно по дате. Я включаю дополнительную информацию в свой вопрос, чтобы отразить это. - person dee; 12.09.2012

Вам нужно понимать разницу между значениями No records и Null. Когда вы говорите - "когда параметр даты находится до '2012-09-10', тогда вложенный выбор сравнивает нулевое значение, а левое соединение не происходит должным образом", это означает, что SELECT возвращает строку, но значение строки равно NULL ( это не то же самое, что нет записей). В этом случае выполнение NVL для значения столбца NULL и замена его поддельной строкой (как вы сказали) будет работать так:

SELECT NVL(CompareValue,'dummy') 
  from Table_Three cv WHERE inDate between cv.Date_ and SYSDATE

Приведенное выше вернет dummy, если CompareValue равно NULL, но не в том случае, если запрос вообще не возвращает NO RECORDS.

Однако, глядя на ваши данные, я не вижу возможности значения NULL, что наводит меня на мысль, что подзапрос фактически не вернет NO RECORDS (не то же самое, что NULL), если inDate до 2012-09-10. В этом случае ваш запрос должен быть в порядке (если где-то еще что-то не так).

person AnBisw    schedule 12.09.2012