Итак, я пытался узнать SQL, но я действительно застрял на чем-то, у меня есть таблица, которая называется студентами, и я пытаюсь отсортировать имена студентов, у которых есть буквы из диапазона AM, но ничего не появляется, хотя у меня есть имена, которые есть буквы Вот содержимое столаВот когда я запускаю команду
Я пробовал это:
SELECT * FROM student WHERE student_first_name like '[A-M]%';
это ничего мне не дает
Я очень новичок в SQL. Но я использую сайт Sqlliteonline.
Как видите, они позволяют выбирать между несколькими различными dbms:es. Подсказка: вы можете переключиться и посмотреть, есть ли разница!


Не уверен в SQL, но я проверил ниже запрос в MySQL, он отлично работает для меня.
Пожалуйста, используйте REGEXP, как показано ниже:
SELECT * FROM student WHERE student_first_name REGEXP '^[A-M]';
Я попробую это через некоторое время, когда доберусь до своего компьютера. Но есть идеи, почему лайк не работает?
@Foze непосредственно регулярное выражение не работает в подобном операторе. если вам нужно использовать как, то вы должны использовать REGEXP_LIKE() вместо LIKE. пожалуйста, следуйте документу здесь docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/…
SQLight LIKE поддерживает только % и _. Для того, что вы пытаетесь сделать, вы можете вместо этого использовать GLOB.
Оператор GLOB аналогичен оператору LIKE. В отличие от оператора LIKE, оператор GLOB чувствителен к регистру и использует подстановочные знаки UNIX.
Я только что попробовал GLOB с квадратными скобками или без них, и он все еще не работает с SQLlite Online.
Оператор LIKE не поддерживает классы символов — только подстановочные знаки.
Чтобы получить все имена, начинающиеся с AM, вы можете
используйте 13 выражений LIKE и их OR
where last_name like 'A%' or last_name like 'B%' or ... or last_name like 'M%'
используйте вариант сопоставления регулярных выражений с вашей СУБД
where last_name ~ '^[A-M]'
используйте функцию вашей СУБД для получения первого символа строки и сравните ее со списком IN
where substr(last_name, 1, 1) in ('A', 'B', ..., 'M')
Ваша версия не сработала, потому что вы попросили ее дать вам всех студентов, чьи имена начинаются с квадратной скобки, и она правильно сказала вам, что их нет.
В дополнение к другим ответам вы также можете использовать Where first_name between 'A' And 'N' And first_name<'N'.
Эта версия имеет гораздо больше шансов быть быстрее, используя любые индексы, которые могут быть в столбце first_name, потому что вы не выполняете вычисления для него.
Я пробовал без квадратных скобок, и это все равно не сработало, я пытаюсь использовать лайк для работы, потому что какой-то чувак сказал мне, что это может работать так, но я все еще не могу понять это
Вы используете SQLite, который поддерживает оператор GLOB, где вы можете использовать подстановочный знак списка [x-y] и * вместо %:
SELECT * FROM student WHERE student_first_name GLOB '[A-M]*';
Обратите внимание, что GLOB чувствителен к регистру.
Если вы хотите, чтобы результаты не учитывали регистр, используйте:
SELECT * FROM student WHERE UPPER(student_first_name) GLOB '[A-M]*';
Tysm, который действительно сработал, но есть идеи, почему он не содержит имя, начинающееся с буквы A? Обновлено: это было просто чувствительно к регистру, на самом деле tysm работало отлично. Другое редактирование: в любом случае я могу сделать его на самом деле нечувствительным к регистру? потому что у меня нет оператора UPPER и он по-прежнему чувствителен к регистру
@Foze Как я уже упоминал в своем ответе, GLOB чувствителен к регистру. Используйте второй запрос, если у вас есть имена, начинающиеся с a или A. Проверьте это: dbfiddle.uk/Ckr8noOJ
Извините, мой плохой, я думал, что ваш второй запрос сказал, что если вы хотите учитывать регистр, большое спасибо за помощь, теперь он работает отлично!
Какие СУБД вы используете? В общем случае SQL LIKE не поддерживает регулярное выражение. Но он есть у одной или двух dbms.