SQL SELECT * FROM table WHERE Столбец NOT LIKE '%str%' не работает, я чувствую себя глупо

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

Итак, у меня есть таблица SQL, в которой последний столбец называется flag:

name:  type:          collation:           null: default:
...
flag   varchar(250)   utf8mb4_0900_ai_ci   yes   NULL

Данные имеют значение double или NULL, и я хочу выбрать все данные, которые не являются двойными. Но ни один оператор не дает никакого результата, например:

SELECT * FROM `table` WHERE `flag` NOT LIKE 'double';
SELECT * FROM `table` WHERE `flag` NOT LIKE '%double%';
SELECT * FROM `table` WHERE `flag` NOT LIKE '%d%';
SELECT * FROM `table` WHERE `flag` != 'double';
SELECT * FROM `table` WHERE NOT flag = 'double';

Я проверил каждую опечатку, в данных нет никаких странных/скрытых символов. Конечно, я мог бы сделать
SELECT * FROM table WHERE flag IS NULL который работает, но будут другие флаги > бесполезные.

Есть идеи, в чем здесь проблема?

mysql status:
--------------
mysql  Ver 8.0.37-0ubuntu0.22.04.3 for Linux on x86_64 ((Ubuntu))

Connection id:          934
Current database:
Current user:           user@localhost
SSL:                    Not in use
Current pager:          less
Using outfile:          ''
Using delimiter:        ;
Server version:         8.0.37-0ubuntu0.22.04.3 (Ubuntu)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
UNIX socket:            /var/run/mysqld/mysqld.sock
Binary data as:         Hexadecimal
Uptime:                 1 hour 12 min 57 sec

Тип БД в InnoDB

Смотрите это ОТЛИЧАЕТСЯ ОТ вопроса.

Adam 22.06.2024 11:49

спасибо, тоже работает. Я не знал об операторе <=> :)

melonlemon 22.06.2024 12:10
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Оператор LIKE работает только со значениями, отличными от NULL.
  • Вам нужно использовать IS NULL/IS NOT NULL для работы с NULL отдельно.
  • Но все это в любом случае спорно, потому что вы не используете LIKE для сопоставления с образцом: похоже, вы выполняете только значение-(не)равенство.
  • Поэтому используйте <>, например:
SELECT
    *
FROM
    `table`
WHERE
    `flag` IS NULL
    OR
    `flag` <> 'double';

ОБНОВЛЕНИЕ: я забыл, что MySQL реализует IS DISTINCT FROM , но с оператором космического корабля: <=> .

«Оператор LIKE работает только со значениями, отличными от NULL». Это была важная информация, спасибо. Можете ли вы уточнить, что вы подразумеваете под «только ценностью (не)равенством»? В чем разница с сопоставлением с образцом?

melonlemon 22.06.2024 12:06

@melonlemon Используйте = для равенства, используйте <> (или !=) для неравенства; используйте LIKE для сопоставления символов с шаблоном (например, SELECT CompanyName FROM softwareCompanies WHERE CompanyName LIKE 'Micro%' вернет 'Microsoft' и 'Microprose'). Хотя вы можете использовать LIKE для равенства (т. е. =), это запутывает любые указатели намерения в вашем SQL, что важно, если вы хотите, чтобы ваш SQL был самодокументируемым.

Dai 22.06.2024 12:12

ах да, понял. Думаю, я просто переключился на НРАВИТСЯ, потому что он работает как подстановочный знак на случай, если в строках данных возникнут какие-то невидимые проблемы.

melonlemon 22.06.2024 12:23

Другие вопросы по теме