SQL Выбор диапазона букв мне ничего не дает

Итак, я пытался узнать SQL, но я действительно застрял на чем-то, у меня есть таблица, которая называется студентами, и я пытаюсь отсортировать имена студентов, у которых есть буквы из диапазона AM, но ничего не появляется, хотя у меня есть имена, которые есть буквы Вот содержимое столаВот когда я запускаю команду

Я пробовал это:

SELECT *  FROM student  WHERE student_first_name  like '[A-M]%';

это ничего мне не дает

Какие СУБД вы используете? В общем случае SQL LIKE не поддерживает регулярное выражение. Но он есть у одной или двух dbms.

jarlh 02.08.2023 13:33

Я очень новичок в SQL. Но я использую сайт Sqlliteonline.

Foze 02.08.2023 13:36

Как видите, они позволяют выбирать между несколькими различными dbms:es. Подсказка: вы можете переключиться и посмотреть, есть ли разница!

jarlh 02.08.2023 13:39
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
3
51
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Не уверен в SQL, но я проверил ниже запрос в MySQL, он отлично работает для меня.

Пожалуйста, используйте REGEXP, как показано ниже:

SELECT * FROM student  WHERE student_first_name REGEXP '^[A-M]';

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

Foze 02.08.2023 13:34

@Foze непосредственно регулярное выражение не работает в подобном операторе. если вам нужно использовать как, то вы должны использовать REGEXP_LIKE() вместо LIKE. пожалуйста, следуйте документу здесь docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/‌​…

Sahu CK 02.08.2023 13:41

SQLight LIKE поддерживает только % и _. Для того, что вы пытаетесь сделать, вы можете вместо этого использовать GLOB.

Оператор GLOB аналогичен оператору LIKE. В отличие от оператора LIKE, оператор GLOB чувствителен к регистру и использует подстановочные знаки UNIX.

Я только что попробовал GLOB с квадратными скобками или без них, и он все еще не работает с SQLlite Online.

Foze 02.08.2023 15:02

Оператор 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')

Скрипт SQL (PostgreSQL)

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

В дополнение к другим ответам вы также можете использовать Where first_name between 'A' And 'N' And first_name<'N'.

Эта версия имеет гораздо больше шансов быть быстрее, используя любые индексы, которые могут быть в столбце first_name, потому что вы не выполняете вычисления для него.

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

Foze 02.08.2023 15:01
Ответ принят как подходящий

Вы используете 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 02.08.2023 15:31

@Foze Как я уже упоминал в своем ответе, GLOB чувствителен к регистру. Используйте второй запрос, если у вас есть имена, начинающиеся с a или A. Проверьте это: dbfiddle.uk/Ckr8noOJ

forpas 02.08.2023 15:36

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

Foze 02.08.2023 15:43

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