Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Результаты MySQL-запроса, включающие нижнюю границу в BETWEEN

#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`

Комментариев нет:

Отправить комментарий