oleja1ee7
@oleja1ee7

Как правильно искать поля типа NULL через LIKE?

Как правильно построить запрос? Имеется поле col1 в таблице nametable, тип данных у него varchar(4), значение по умолчанию null, т.к. оно не всегда заполняется.
Необходимо при вводе текста в text_pole_1 и нажатие на клавишу отобразить соответствующие запросу записи. Проблема в том, что так как поле по умолчанию null возможно вывести пустые записи запросом:
SELECT * FROM nametable WHERE col1 is null;
Но тогда будут только пустые записи.

Если использовать:
SELECT * FROM nametable  WHERE col1 like '%"+ui->text_pole_1->text()+"%' or col1 is null;

Будут выводиться и пустые и те, что соответствуют запросу в текстовом поле.

А вот в таком случае, пустые поля вообще не отображаются, даже при пустом текстовом поле
SELECT * FROM nametable  WHERE col1 like '%"+ui->text_pole_1->text()+"%';
  • Вопрос задан
  • 951 просмотр
Решения вопроса 1
AnatolTh
@AnatolTh
Full Stack Developer
В T-SQL есть IsNull()
SELECT * FROM nametable WHERE IsNull(col1,'') like '%"+ui->text_pole_1->text()+"%' ;

В MySQL есть IfNull()
SELECT * FROM nametable WHERE IfNull(col1,'') like '%"+ui->text_pole_1->text()+"%' ;


Так же есть COALESCE() и NVL()
SELECT * FROM nametable WHERE coalesce(col1,'') like '%"+ui->text_pole_1->text()+"%' ;

SELECT * FROM nametable WHERE nvl(col1,'') like '%"+ui->text_pole_1->text()+"%' ;


В данных примерах мы NULL заменили на пустую строку
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
Вы начните с вопроса - а что вы получить-то хотите? Исходя из этого уже конструируйте запрос. Потому что все 3 запроса в вопросе полностью корректны и именно что и должны вести себя различным образом.

С вариантами типа функция(поле) like 'pattern' - аккуратнее. Для большинства субд это обозначает сознательный отказ от использования индексов по этому полю. Для like '%pattern%' впрочем это и так справедливо для любых btree, не префиксовый поиск вести по btree штука закономерно не эффективная.

PS: и ой большое опасение у меня по этому фрагменту что у вас sql инъекции открыты во всю свою ширину.
Ответ написан
duhbox
@duhbox
null нельзя сравнить с null
Для обхода нужно заменить null на что-то другое, например на пробел, и после можно будет сравнивать.
Пример для oracle:

SELECT * FROM nametable WHERE nvl(col1,' ') like '%"+ui->text_pole_1->text()+"%';

сам пустой поисковый запрос также нужно заменить на пробел.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы