Неожиданные пустые результаты запроса - PullRequest
1 голос
/ 27 октября 2009

Хорошо, это тупой. , , .

Select * from <table> where <col1> is null and <col2> = 1;

<col1> - это varchar2 (5 байт) без значения по умолчанию <col2> это число по умолчанию -1

Почему мой запрос не возвращает никаких записей? Я точно знаю, что запрос ДОЛЖЕН вернуть набор результатов, но я ничего не получаю.

Если я это сделаю:

Select * from <table> where <col1> is null; 

Возвращается 127531 записей

Если я это сделаю:

Select * from <table> where <col2> = 1; 

Я получил 86342 записей, возвращенных

Неужели Oracle странным образом обрабатывает нулевые значения? Я MSSQL своего рода человек.

Ответы [ 5 ]

7 голосов
/ 27 октября 2009

Из того, что вы пишете, я не уверен, что запрос должен возвращать запись ... мне кажется, что у вас нет строк, удовлетворяющих обоим условиям.

Может быть, вы хотите OR два условия (получить записи, которые удовлетворяют любому из двух условий)?

2 голосов
/ 27 октября 2009

Ваш выбор выглядит правильным для меня, если вы не получите результаты, то это проблема с данными, а не проблема Oracle / select.

Но вы уверены, что данные в столбце col1 равны нулю, когда значения отсутствуют? Это также может быть просто пустое значение (''), а не "нулевое" значение, в зависимости от процесса записи данных.

Так что, чтобы быть в безопасности, лучше попробуйте:

Select * from <table> where ( <col1> is null or <col1> = '' ) and <col2> = 1;

1 голос
/ 27 октября 2009

Я думаю, что ваша проблема в том, что нет строк, в которых col1 равно NULL, а col2 равно 1. Do ...

SELECT COUNT(*)
FROM <table>

Есть ли в таблице более 127531 + 86342 записей? Тогда возможно, что ни один ряд не соответствует вашему состоянию. Попробуйте также ...

SELECT COUNT(*) 
FROM <table> 
WHERE <col1> IS NOT NULL 
   OR <col2> IS NULL OR <col2> <> 1

Это даст количество строк, которые не влияют на ваше состояние. Это то же самое, что и общее количество записей в таблице? Тогда верно, что ваш оригинальный запрос ничего не возвращает.

Я не знаю, что вы подразумеваете под странной обработкой NULL. Я думаю, что Oracle делает по-другому только то, что пустая строка равна NULL. Когда вы сравниваете строки в Oracle, вы должны помнить об этом. Я знаю, что вы также можете настроить MSSQL так же.

Я почти уверен, что по умолчанию (без какой-то странной пользовательской конфигурации) MSSQL и Oracle оба обрабатывают NULL одинаково при использовании в логическом выражении "Boolean". Но я нашел это странным, когда впервые узнал, как это работает.

NULL, НЕ NULL: Они работают как вы ожидаете. Они возвращают ИСТИНА или ЛОЖЬ в зависимости от того, является ли значение НЕДЕЙСТВИТЕЛЬНЫМ или нет.

ВСЕ ДРУГИЕ СРАВНИТЕЛЬНЫЕ ОПЕРАТОРЫ: Если одно или оба сравниваемых значения равны NULL, результат операции равен NULL. (например, NULL <1 оценивается в NULL, NULL = NULL оценивается в NULL, NULL <> 1 оценивается в NULL)

ВСЕ ЛОГИЧЕСКИЕ ОПЕРАТОРЫ (НЕ, И, ИЛИ, ...): Если один или несколько операндов имеют значение NULL, оцените операцию так, как если бы значения NULL могли быть ИСТИНАМИ и ЛОЖЬМИ. Если этот метод возвращает TRUE в некоторых случаях и FALSE в других, результатом будет NULL. (например, NULL AND FALSE оценивается как FALSE, NULL AND TRUE оценивается как NULL, NOT NULL оценивается как NULL)

КОГДА ИСПОЛЬЗУЕТСЯ В УСЛОВНЫХ УСЛОВИЯХ / ГДЕ: Логическое выражение, которое оценивается как NULL, имеет тот же эффект, что и выражение, которое оценивается как FALSE. Блоки IF не выполняются и строки, для которых выражение WHERE оценивается как NULL, не возвращаются.

Примеры: * 1 021 *

DECLARE
  A NUMBER;
BEGIN
  A:=0; 
  IF NULL = NULL THEN 
    A:=1; 
  END IF;
  DBMS_OUTPUT.PUT_LINE(A);  -- this will print 0.
END;

-- without the WHERE clause, following query
-- would result in a single row of single value "hi"
SELECT 'hi'
FROM dual
WHERE 1 <> NULL OR NULL = NULL; -- this returns no rows

РЕДАКТИРОВАТЬ: исправлено содержание и код

1 голос
/ 27 октября 2009

У вас есть два счета для каждого из ваших фильтров, но нет указания, сколько записей соответствует обоим критериям. Если вы хотите проверить, можете ли вы выполнить следующий запрос:

select count(*) from 
(
    Select * from <table> where <col1> is null
    intersect
    Select * from <table> where <col2> = 1)
/

Мои деньги на это возвращаются 0.

0 голосов
/ 27 октября 2009

Если я это сделаю: выберите * откуда нулевой; тогда я получаю 127531 возвращенные записи Выберите * из где = 1; тогда я получаю 86342 возвращено записей

Ваш синтаксис кажется правильным, однако, возможно, нет записей, которые бы выполняли оба условия, возможно, вы пытаетесь использовать ИЛИ, или, возможно, ваша СУБД делает странные вещи, у меня были некоторые проблемы, подобные этой в SQL Navigator 6, они уже приняли эту проблему и исправили ее в версии 6.1

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...