#mysql #sql
Как выбрать все имена из таблицы, первая буква в которых удовлетворяет диапазону букв от Р до Я? Составил такой запрос: SELECT `name` FROM `table1` WHERE `name` BETWEEN 'Р' AND 'Я' ORDER BY `name` В результирующей выборке отсутствуют результаты в которых name начинается с буквы Я, из чего я сделал вывод что BETWEEN выбирает значения, включая первую границу (Р), но не включая в результат вторую границу (Я). Есть ли возможность составить такой запрос, чтобы имена с буквой Я тоже попали в результаты? Нашёл такое решение: SELECT name FROM table1 WHERE nameBETWEEN 'Р' AND 'Я' OR surnameLIKE 'Я%' ORDER BYname` Но если вдруг кто-то предложит более элегантное решение, буду рад изменить свой подход )
Ответы
Ответ 1
наверно, не всё поле надо сравнивать с буквой, а только первый символ: substring(name,1,1) пример: SQL Fiddle MySQL 5.6 Schema Setup: create table t (n text); insert into t values ('яблоки на снегу'); Query 1: select * from t where n between 'р' and 'я' Results: Query 2: select * from t where substring(n,1,1) between 'р' and 'я' Results: | n | |-----------------| | яблоки на снегу |Ответ 2
Для особо догадливых, на вопросы смотрящих ширше, вникающих глубже. Воспользуемся тем, что нестрогие неравенства можно заменить на строгие. x between a and b === a <= x and x <= b === (a-1) < x and x < (b+1) Когда a == минимальному значению из всего допустимого множества значений, тогда сравнивать с ним никакого смысла не имеет, можем убрать неравенство c a, останется: x <= b Тоже самое, когда b == максимальному значению: a <= x. Исходя из выше сказанного и учитывая, что 'Я' - это последняя (т.е. максимальная) буква, условие из вопроса записывается в коротком виде: 'Р' <= name Запрос SELECT ... FROM ... WHERE 'Р' <= name вопреки ожиданиям автора вопроса (как он понял мой коммент) всё-таки вернёт среди прочих и записи, в которых name начинается на букву 'Я'. Для диапазона букв, не включающего последнюю букву 'Я', вместо верхнего предела берём следующую букву. Например вывести записи с именами, начинающимися с буквы от 'Р' до 'У' включительно. Следующая буква после буквы 'У' - это буква 'Ф'. Значит запрос будет выглядеть так: SELECT ... FROM ... WHERE 'Р' <= name AND name < 'Ф'.Ответ 3
При некоторых естественных предположениях: SELECT `name` FROM `table1` WHERE `name` BETWEEN 'Р' AND 'Яя' ORDER BY `name` А так без предположений :-) SELECT `name` FROM `table1` WHERE `name` BETWEEN 'Р' AND concat('Я',char(ascii('Я')+1)) ORDER BY `name`
Комментариев нет:
Отправить комментарий