Oracle не равно пусто

Обновлено: 04.07.2024

У меня есть таблица, в которой в некоторых строках есть пустые cells . Я пробовал выделять такие строки с помощью функции IS NULL. Но запрос выбирает 0 строк.

Теперь я изменил свой запрос на:

Получил желаемый результат.

Почему IS NULL не дает результата? В чем разница между IS NULL и '' , поскольку ячейки пусты. Пожалуйста, объясни.

Некоторые отличия между ними:

  • NULL можно присвоить любому типу, в отличие от пустой строки, которая несовместима с полями даты / числовых значений.
  • NULL - НЕИЗВЕСТНОЕ значение, у него нет значения, в отличие от пустой строки, которая является значением, но пустой.
  • Насколько мне известно, NULL не должен захватывать память, в отличие от пустой строки, которая это делает.
  • null = null приведет к null , а не к ''='' , что приведет к TRUE .

Вы можете изменить свой запрос, как показано ниже:

Этот запрос вернет все пустые ячейки, а также ячейку с нулевыми значениями.

  1. Значения NULL представляют собой отсутствующие неизвестные данные.
  2. Пустые данные - это фактические данные, введенные как пустые при вводе.

Null - это отсутствие значения. Пустая строка - это значение, но она просто пуста.

Null - это особенность базы данных.

Используя NULL, вы можете различать «не помещать данные» и «помещать пустые данные».

Еще несколько отличий:

ДЛИНА NULL равна NULL, ДЛИНА пустой строки равна 0. NULL сортируются перед пустыми строками. COUNT (message) будет считать пустые строки, но не NULL. Вы можете искать пустую строку, используя связанную переменную, но не NULL. Этот запрос:

Никогда не будет соответствовать NULL в mytext, какое бы значение вы ни передали от клиента. Чтобы сопоставить NULL, вам придется использовать другой запрос

SELECT * FROM mytable WHERE mytext IS NULL

Он не может найти NULL, потому что у него нет значения

Пустая строка - это значение, но оно пустое.

Только если это значение, оно может сравниваться с другим значением

Это потому, что ячейка, содержащая NULL, и пустая ячейка - это две разные вещи. т.е. -> NULL не то же самое, что '' или "".

В Oracle есть ключевое слово NULL, которое означает, что определенное значение неизвестно и неопределенно. Поскольку это неизвестно, существует множество возможностей. Следовательно, NULL не является определенным значением.

пример 1

Пример 2:

- Вышеприведенный оператор создает таблицу только с одним столбцом ename, добавляет ограничения к этому столбцу, его значение может быть только в списке ('a', null). Но на самом деле мы можем вставить любой символ. В настоящее время, похоже, что null может Он представляет все символы. Удалите его и только insert'a '

- По нашему предположению, если null может представлять все символы, то он отрицается и никакие символы не могут быть введены. Но на самом деле это не так. Здесь, похоже, это не имеет никакого эффекта. Удаление и удаление эффекта не происходит. Вы можете вставить кроме Любой персонаж, кроме '

1. Как понять это использование нуля

Так как null является неопределенным типом, то:

Пример 1 Два целочисленных значения v_a и v_b равны нулю. Чтобы сделать их равными, все равно, что сравнивать две переменные с неопределенными типами и неопределенными значениями, поэтому они не могут быть равными.

Значение true или v_b1 - правда, состоит в том, что если перед или верно, то v_b1 за ним не оценивается.

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

Таким образом, нетрудно понять, почему мы вставляем нулевое значение в таблицу, но мы не можем делать запросы, оценивая условие = null. Однако Oracle предоставляет ключевое слово, чтобы судить, является ли значение нулевым.

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

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

Выполните математические операции с нулем и любым числом, и результат будет нулевым

Когда null и строка объединяются, они будут использоваться как пустая строка. Вы можете использовать ||, чтобы объединить пустую строку или null со строкой, или concat ('a', null).

2. пустая и пустая строка

Oracle обрабатывает пустую строку, т. Е. `` Как ноль.

Поэтому, если вы вставите пустую запись, Oracle по умолчанию преобразует ее в нулевое значение.

3. Суждение нулевой и пустой строки

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

4. Преобразование нулевой и пустой строки

NVL( string1, replace_with)

Функция: Если string1 равен NULL, функция NVL возвращает значение replace_with, в противном случае возвращает значение string1. к

Таким образом, роль этого NVL такая же, как и ISNULL (string1, replace_with) в SQLserver. к

Примечание: string1 и replace_with должны быть одного типа данных, если только функция TO_CHAR не используется, как показано. к

4. Меры предосторожности при использовании null

При использовании встроенных функций Oracle, таких как avg, max, min и т. Д., Столбцы NULL игнорируются.

Если вы далеки от работы с базами данных, для вас может быть открытием, что ноль – это не значение NULL, хотя, признаем, они созвучны. Кроме того, NULL не является значением пустой строки, хотя можно найти поле, содержащее данные любого типа.

NULL можно представить как значение для представления неизвестного фрагмента данных (обратите внимание: не нулевого, хотя поле при этом выглядит пустым). А еще он не равен ничему, даже другому NULL. И сегодня мы поговорим об этом загадочном (на первый взгляд) значении NULL более подробно.

Пример значения NULL

Итак, что вы должны знать о значении NULL? Давайте разбираться.

Представьте себе письменный стол, на котором лежат канцелярские принадлежности: 6 шариковых ручек и 2 простых карандаша. Также известно, что в ящике стола должны быть фломастеры. Но вот сколько их и есть ли они вообще — данных нет. Если нам нужно составить таблицу инвентаризации с вводом значения NULL, то выглядеть она будет так:

InventoryID Item Количество
1 ручки 6
2 карандаши 2
3 фломастеры NULL

Как вы понимаете, принимать за «0» количество фломастеров в данном случае было бы неверным, так как подобная запись показывала бы, что фломастеров нет вообще. Но точные данные об их количестве отсутствуют, поэтому может оказаться, что несколько штук все же есть.

Значение NULL и НЕ NULL

IS NULL и IS NOT NULL – специально созданные операторы, которые осуществляют сравнение имеющихся NULLов. IS NULL возвращает истину, если операнда является NULLом. Соответственно, если операнд не является NULLом, то значение будет ложным.

IS NOT NULL имеет обратный принцип: значение будет истинным, если операнд не является NULLом, и ложным, если он таковым является.

Учтите, что когда речь идет об отсутствующих значениях, есть особые случаи их сравнения:

  • DECODE — принимает два NULLа за равные значения;
  • составные индексы — в случае, когда у двух ключей есть пустые поля, но заполненные поля при этом равны между собой, то Oracle воспримет эти ключи, как равные.

Как стать бэкенд-разработчиком: требования, пошаговая инструкция, полезные книги

Вот так проявляет себя DECODE:

select decode( null

Значение NULL в MySQL

Результат при сравнении NULLов, в зависимости от операции SQL, часто будет иметь значение NULL. Предположим, что А НЕДЕЙСТВИТЕЛЕН:

Арифметические операторы

  • A + B = NULL
  • A – B = NULL
  • A * B = NULL
  • A/B = NULL

Ваш Путь в IT начинается здесь

Подробнее
  • A = B = NULL
  • A! = B = NULL
  • A> B = NULL
  • A!
Эти случаи — лишь часть примеров операторов, возвращающих значение NULL при равенстве NULL одного из операндов. На практике встречаются куда более сложные запросы, чья обработка затруднена количеством значений NULL. Главное, нужно понимать и планировать итоги работы с базой данных, в которой вы разрешаете значение NULL.

Логические операции и NULL

Для логических операторов AND и OR есть свои особенности при работе со значением NULL. Краткое руководство рассмотрим на примере.

Как правило, НЕИЗВЕСТНО обрабатывается так же, как и состояние ЛОЖЬ. Если выбрать из таблицы строки и вычисление условия X=NULL в предложении WHERE дало результат НЕИЗВЕСТНО, то ни одной строки не будет получено. Но есть и различия: выражение НЕ(ЛОЖЬ) вернет истину, а НЕ(ИЗВЕСТНО) вернет НЕИЗВЕСТНО.

Чаще всего с неизвестным результатом работают как с ЛОЖЬЮ:

При отрицании неизвестности результатом будет НЕИЗВЕСТНО:

Функция NULL в MySQL

В системе MySQL есть ряд функций, позволяющих результативно работать с NULL. Это IFNULL, NULLIF и COALESCE.

  • IFNULL может принять два параметра: возвращает первый аргумент, если он не является NULL, в обратном случае — возвращает второй аргумент.
  • NULLIF также может принять два аргумента: если они равны, то функция возвращает NULL, в обратном случае — возвращает первый аргумент. Эта функция также будет эффективна, если в вашей таблице в столбце есть пустые строки со значением NULL.
  • COALESCE может принимать список аргументов и возвращать первый аргумент не-NULL. Например, эту функцию можно применять для базы контактных данных с потенциальной возможностью в зависимости от важности информации в порядке Телефон — Электронная почта — N/A.
Как увеличить свой доход минимум на 50% выбрав правильную профессию Запутались в разнообразии профессий и не знаете, куда двигаться? Хотите больше зарабатывать или работать удалённо? Уже повзрослели, но так и не поняли, кем хотите стать? Мечтаете наконец найти любимую работу и уйти с нелюбимой?

Александр Сагун

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

Карьерная мастерская это:

  • Список из 30 востребованных современных профессий.
  • Долгосрочный план по развитию в той профессии, которая вам подходит.
  • Список каналов для поиска работы.
  • 3 теста на определение своих способностей и склонностей.
  • Практику в разных профессиях на реальных задачах.

Уже 50 000 человек прошли мастерскую и сделали шаг к новой профессии!

Запишитесь на бесплатный курс и станьте ближе к новой карьере:

Зарегистрироваться и получить подарки

Операторы IN и NOT IN для значения NULL

Чтобы понять взаимодействие этих операторов с NULLом, рассмотрим пример.

Создадим таблицу Т, состоящую из одного числового столбца А и строками: 1, 2, 3 и NULL.

create table t as select column_value a from table(sys.odcinumberlist(1,2,3,null));

Затем выполним трассировку запроса (учтите, что для этого нужно обладать ролью PLUSTRACE).

От трассировки в листингах оставлена часть filter, чтобы показать преобразование указанных в запросе условий.

set autotrace on

Теперь, после подготовительных действий, попробуем выбрать те записи, которые будут соответствовать набору (1, 2, NULL).

По какой-то причине строка с NULLом не выбрана. Возможно, это случилось потому, что вычисление предиката «А»=TO_NUMBER(NULL) вернуло состояние НЕИЗВЕСТНО. Попробуем явно указать условие включения NULLов в результаты запросов:

Попробуем с NOT IN:

Ни одной записи так и не появилось.

Адаптивная верстка: задачи, преимущества и виды

Это объясняется тем, что трехзначная логика NOT IN не взаимодействует с NULLами: при попадании NULL в условия отбора данных можно не ждать.

Значение NULL и пустая строка в СУБД

Oracle отличается от стандартов ANSI SQL в определении NULLов: он проводит знак равенства между NULL и пустой строкой. Эта особенность программы рождает много споров, хотя Oracle и заявляет, что, возможно, в будущих релизах будет изменен подход в обработке пустой строки, как NULL. Но в реальности проведение таких изменений сомнительно, так как под эту СУБД написано неимоверное количество кода.

Если попытаться найти причину, почему вообще пустую строку стали считать эквивалентной NULL, то ответ можно найти в формате хранения varchar`ов и NULLов внутри блоков данных. Табличные строки Oracle хранит в структуре, представляющей собой заголовок и следующими за ним столбцы с данными.

Каждый столбец, в свою очередь, состоит из 2-х полей: длина данных в столбце (1 или 3 байта) и сами данные. При нулевой длине varchar2 в поле с данными нечего вносить, так как оно не занимает ни байта. В поле же, где указывается длина, вносится специальное значение 0xFF, что и означает отсутствие данных.

NULL Oracle представляет аналогично, то есть отсутствует поле с данными, а в поле длины данных вносится 0xFF. Так как изначально разработчики Oracle не разделяли эти два состояния, то и сейчас принцип внесения данных не изменился.

Значение NULL

Значение NULL

Неопределенная длина пустой строки:

Сравнение с пустой строкой невозможно:

Критика такого подхода Oracle к значениям NULL и пустой строки, основывается на том, что не всегда пустая строка может означать неизвестность. Например, когда менеджер-продавец вносит данные в карточку клиента, то в поле «Контактный номер» он может указать конкретный номер; также он может указать, что номер неизвестен (NULL); но еще он может указать, что номера как такового нет (пустая строка).

С методом хранения пустых строк, предлагаемым Oracle, последний случай будет очень затруднительно осуществить. Если смотреть на этот довод критики через призму семантики, то звучит он очень убедительно. Но с другой стороны, каким образом менеджер сможет внести в поле «Контакты» пустую строку, и как в будущем он сможет отличить ее от «номер неизвестен» (NULL)?

Отличия между null и undefined

Можно сказать, что NULL – это такое значение, которое является определенным для отсутствующего объекта. UNDEFINED же означает именно неопределенность. Например:

var element;

// значение переменной element до её инициализации не определённо: undefined

// здесь при попытке получения несуществующего элемента, метод getElementById возвращает null

// переменная element теперь инициализирована значением null, её значение определено

Осуществляя проверку на NULL или UNDEFINED, нужно помнить о разнице в операторах равенства (==) и идентичности (===): с первым оператором производится преобразование типов.

typeof undefined // undefined

null === undefined // false

null == undefined // true

Это все то, что вы должны знать о значении NULL. Обрастая опытом и применяя некоторые уловки для избежания NullPointerException, вы научитесь делать безопасный код. Главным образом неразбериха возникает из-за того, что NULL может трактоваться как пустое значение или как неидентифицированное.

Поэтому важно документально фиксировать поведение метода, когда есть входящее значение NULL. Держите в памяти, что NULL – это значение по умолчанию ссылочных переменных. И вызывать методы экземпляра или получать доступ к переменным экземпляра, применяя NULL-ссылку, вы не можете.

Войти

Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal

Аргумент NULL или как отбирать пустые поля в SQL

Прочитав название темы, можно задать вопрос: "А зачем вообще вводить в БД поля, не содержащие значений?" Ответ на этот вопрос кроется в тексте ниже.
Что такое база данных? Это информация, которая формируется и развивается на протяжении всего времени своего существования. Постоянно приходится что-то добавлять, что-то убирать. И так на протяжении всего жизненного цикла БД. Однако, есть такие периоды, точней моменты в жизни БД, когда есть часть информации об объекте и предполагается, что остальная часть будет добавлена по истечении какого-то периода времени.
Для примера возьмём таблицу должников.

Debtors
NumMonthYearSnameCityAddressDebt
0001Июль2012ИвановСтавропольСтавропольская, 150000
0002Декабрь2019КононовТатаркаЗагородная, 254684068
0003Май2013ЯмшинМихайловскСельская, 48165840
0004Август2012ПрениСтавропольЦентральная, 1646580
. . . . . . .
9564Март2015УлиеваДёминоМеждународная, 156435089
9565Октябрь2012ПавловаСтавропольВокзальная, 3768059
9566Январь2012УрюпаМихайловскФонтанная, 1951238
9567Ноябрь2017ВальетовТатаркаВыездная, 65789654


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


Debtors
NumMonthYearSnameCityAddressDebt
0001Июль2012ИвановСтавропольСтавропольская, 150000
0002Декабрь2019КононовТатаркаЗагородная, 254684068
0003Май2013ЯмшинМихайловскСельская, 48165840
0004Август2012ПрениСтавропольЦентральная, 1646580
. . . . . . .
9564Март2015УлиеваДёминоМеждународная, 156435089
9565Октябрь2012ПавловаСтавропольВокзальная, 3768059
9566Январь2012УрюпаМихайловскФонтанная, 1951238
9567Ноябрь2017ВальетовТатаркаВыездная, 65789654
9568Февраль2015ЯлтиновСпицевкаСтепная, 43NULL

Как говорилось выше, значение NULL подразумевает, что поле с таким значением не содержит каких-либо данных, которыми могли бы оперировать SQL-запросы. То есть, если проводить какие-либо отборы по используя данный оператор, результат будет таким же, как и при указании неверной неверной строки. Другими словами, любой запрос типа
SELECT *
FROM Debtors
WHERE любой столбец NULL ;
Приведёт к тому, что программа работы с БД выдаст ошибку.
Для выхода из такой ситуации в SQL существует специальный оператор, который используется с ключевым словом NULL - это оператор IS. Теперь можно задать запрос, который смог бы отобрать строки, содержащие, точней не содержащие никаких значений
SELECT *
FROM Debtors
WHERE Debts IS NULL ;
Результатом будет следующее


Debtors
NumMonthYearSnameCityAddressDebt
9568Февраль2015ЯлтиновСпицевкаСтепная, 43NULL

Если перевести ключевые слова строки запроса "WHERE Debts IS NULL" с английского, то получится буквально следующее: "ГДЕ Debts ЕСТЬ ПУСТОЕ"
Можно ли сделать, чтобы запрос с ключевым словом NULL игнорировался? Можно! Достаточно перед ним поставить Булево выражение NOT.
Есть несколько вариантов размещения ключевого слова NOT в запросе, да бы игнорировалось значение NULL
SELECT *
FROM Debtors
WHERE Debt NOT IS NULL ;
Или же использовать
SELECT *
FROM Debtors
WHERE NOT Debt IS NULL ;
Результат обоих запросов будет один

Debtors
NumMonthYearSnameCityAddressDebt
0001Июль2012ИвановСтавропольСтавропольская, 150000
0002Декабрь2019КононовТатаркаЗагородная, 254684068
0003Май2013ЯмшинМихайловскСельская, 48165840
0004Август2012ПрениСтавропольЦентральная, 1646580
. . . . . . .
9564Март2015УлиеваДёминоМеждународная, 156435089
9565Октябрь2012ПавловаСтавропольВокзальная, 3768059
9566Январь2012УрюпаМихайловскФонтанная, 1951238
9567Ноябрь2017ВальетовТатаркаВыездная, 65789654

То есть данные запросы попросту убрали из табличной части БД строки, содержащие в столбце Debt пустые ячейки.
Эта запись была посвящена тому, как ведёт себя БД, если в её состав входят ячейки с отсутствующими данными. Так же было сказано о том, как можно исключать такие ячейки при помощи операторов NULL и IS NULL.

Читайте также: