Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Совместное использование оператора BETWEEN и LIKE

32K
20 января 2011 года
paska
26 / / 06.02.2009
Здравствуйте. Мне необходимо на писать запрос который бы выводил из таблицы все города названия которых начинаются например от F до M. Пишу следующий запрос,
 
Код:
SELECT city FROM cust WHERE city BETWEEN city LIKE 'f%' AND city LIKE 'm%';


- который выдает ошибку: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'like 'l%' and city like 'r%'' at line 1.

Подскажите ,где я ошибся. В заранее огромное спасибо.
278
20 января 2011 года
Alexander92
1.1K / / 04.08.2008
 
Код:
SELECT `city` FROM `cust` WHERE `city` BETWEEN 'F%' AND 'M%';
33K
20 января 2011 года
hivewarrior
205 / / 16.11.2010
Может, я, конечно, нуб и ничего в SQL не понимаю, но зачем тебе там LIKE?
32K
20 января 2011 года
paska
26 / / 06.02.2009
Оператор LIKE используется, чтобы находить подстроки в указанном поле таблицы. например по идее 'g%' означает что нужно найти строку начинающуюся с 'g'.
32K
20 января 2011 года
paska
26 / / 06.02.2009
не так выдает не правильный результат
278
20 января 2011 года
Alexander92
1.1K / / 04.08.2008
Так ты определись, либо LIKE, либо BETWEEN. LIKE возвращает булеву переменную (0/1), а BETWEEN на вход принимает диапазон какой-то, их в принципе совместить невозможно. И что значит неправильный результат?
32K
20 января 2011 года
Clubberry
186 / / 19.01.2011
 
Код:
SELECT city FROM cust WHERE city BETWEEN city LIKE 'f%' AND 'm%' DESC


так попробуй
33K
20 января 2011 года
hivewarrior
205 / / 16.11.2010
BETWEEN
Дальше вспоминаем сравнение SQL строк и понимаем, что строка Last, например, лежит таки между F и M.
32K
20 января 2011 года
Clubberry
186 / / 19.01.2011
hivewarrior
т.е.
 
Код:
SELECT city FROM cust WHERE city LIKE 'F%' AND 'M%' DESC

?
33K
20 января 2011 года
hivewarrior
205 / / 16.11.2010
Цитата: Clubberry
hivewarrior
т.е.
 
Код:
SELECT city FROM cust WHERE city LIKE 'F%' AND 'M%' DESC

?



Не взлетит. Возвратит города, которые начинаются на F и M, а не города между ними.

33K
20 января 2011 года
hivewarrior
205 / / 16.11.2010
Нужно, скорее всего, как уже написал Alexander92, но без `.
32K
20 января 2011 года
Clubberry
186 / / 19.01.2011
тю, он хочет найти все города у которых первая буква F, последняя M?
тогда поидее так
 
Код:
SELECT city FROM cust WHERE city LIKE 'F%M'
32K
20 января 2011 года
Clubberry
186 / / 19.01.2011
Цитата: hivewarrior
Нужно, скорее всего, как уже написал Alexander92, но без `.


он написал, что не помоголо. ну разве что он не убрал эти самые кавычки.

33K
20 января 2011 года
hivewarrior
205 / / 16.11.2010
Цитата: Clubberry
тю, он хочет найти все города у которых первая буква F, последняя M?
тогда поидее так
 
Код:
SELECT city FROM cust WHERE city LIKE 'F%M'


Нет же. Ему нужны города от F до M.

Алсо, в предыдущем посте написал, что

 
Код:
SELECT city FROM cust WHERE city LIKE 'F%' AND 'M%' DESC

будет работать, что не верно. Скорее всего не съест эту часть
 
Код:
AND 'M%'
5
20 января 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: paska
Здравствуйте. Мне необходимо на писать запрос который бы выводил из таблицы все города названия которых начинаются например от F до M.


T-SQL

 
Код:
SELECT DISTINCT city FROM cust WHERE city BETWEEN 'E' AND 'N'
37K
21 января 2011 года
freets
97 / / 15.10.2010
t-sql
 
Код:
SELECT city FROM cust WHERE ascii(city) BETWEEN ascii('F') AND ascii('M')
32K
21 января 2011 года
Clubberry
186 / / 19.01.2011
Цитата: freets
t-sql
 
Код:
ascii


what is this?

6
21 января 2011 года
George
4.1K / / 05.01.2007
Цитата: Clubberry
what is this?


Небось функция возвращающая ASCII код символа переданного в кач-ве параметра. :)

37K
21 января 2011 года
freets
97 / / 15.10.2010
Цитата: George
Небось функция возвращающая ASCII код символа переданного в кач-ве параметра. :)



...первого! символа параметра.

385
22 января 2011 года
SomewherSomehow
477 / / 25.07.2004
Цитата: freets
...первого! символа параметра.


И зачем оно здесь надо, можете объяснить? Абсолютно бесполезно.

10
22 января 2011 года
Freeman
3.2K / / 06.03.2004
freets прав. Вариант hardcase выведет все города от E% до N. Вы знаете город N? Не город имярек, а именно город с названием N? В задаче про него ничего нет. Нужны все города, начинающиеся с N.
385
22 января 2011 года
SomewherSomehow
477 / / 25.07.2004
Читайте внимательнее, я ничего не говорил про вариант hardcase. Просто использование ascii тут совершенно ни к чему.
Не за чем извлекать первый символ, если 'a' всегда меньше 'aa', 'ab' и т.д.
Если требуется найти
Цитата:
все города названия которых начинаются например от F до M

(и считаем, что города начинающиеся с М - включаем), то искомое даст вариант

 
Код:
SELECT city FROM cust WHERE city >= 'F' AND city < 'N'

А использование ascii говорит только о том, что автору кода неиззвестно, как идет сравнение символьных строк.
Кстати, вариант hardcase, имхо лучший из предложенных, т.к. иллюстрирует принцип сравнения, пусть и немного неточен в самом условии, но этот вариант уж точно не подталкивает к использованию ascii и вайлдкардсов.

Upd:
Я так понял этот ответ адресуеся не Freeman, а тому кто работал вместо него =)
10
23 января 2011 года
Freeman
3.2K / / 06.03.2004
Тем не менее. Проверил на реальном сервере. Oracle, но дела это не меняет, функции те же.

Подготовка:
[highlight=sql]
create table cust (
city varchar2(30)
);

insert into cust
select 'Ashgabat' from dual union all
select 'Astana' from dual union all
select 'Baki' from dual union all
select 'Bishkek' from dual union all
select 'Chisinau' from dual union all
select 'Dushanbe' from dual union all
select 'Kyiv' from dual union all
select 'Minsk' from dual union all
select 'Moscow' from dual union all
select 'Riga' from dual union all
select 'Tallinn' from dual union all
select 'Tashkent' from dual union all
select 'Tbilisi' from dual union all
select 'Vinlius' from dual union all
select 'Yerevan' from dual;
[/highlight]

Вариант hardcase:
[highlight=sql]
select city from cust
where city between 'F' and 'M'
[/highlight]
 
Код:
CITY
------
Kyiv


Вариант freets:
[highlight=sql]
select city from cust
where ascii(city) between ascii('F') and ascii('M')
[/highlight]
 
Код:
CITY
--------
Kyiv
Minsk
Moscow


Ч. т. д.

Цитата: SomewherSomehow
автору кода неиззвестно, как идет сравнение символьных строк


Похоже, это неизвестно тому, кто работает вместо меня. :p

385
23 января 2011 года
SomewherSomehow
477 / / 25.07.2004
Эээ...кагбэ непонятно вот это откуда?
Цитата: Freeman

Вариант hardcase:
[highlight=sql]
select city from cust
where city between 'F' and 'M'
[/highlight]
 
Код:
CITY
------
Kyiv


Вроде там другой вариант, ага?=)

Цитата: hardcase
T-SQL
 
Код:
SELECT DISTINCT city FROM cust WHERE city BETWEEN 'E' AND 'N'


Ну и потом, что выдаст нормальный вариант из моего предыдущего поста, без функции ansii?

 
Код:
SELECT city FROM cust WHERE city >= 'F' AND city < 'N'

Кстати, зачем проверять на оракл, когда речь шла о mssql? =)
(хотя я думаю и то, и то - удовлетворяет в сравнении строк требованиям стандарта, так что тем более нет смысла использовать лишние функции)
Хотя конечно если кто-то привык "в гамаке и стоя"...в общем, вот мой вариант для mssql
 
Код:
select
    city
from
    @cust
where
    ascii(lower(substring(reverse(city),(len(city)),1)) collate Cyrillic_General_CI_AS)
    between ascii(lower('F') collate Cyrillic_General_CI_AS) and ascii(lower('M')collate Cyrillic_General_CI_AS)

Если соревнование по количеству строк будет продолжаться, дайте срок, я вам еще тут рекурсивное cte как-нить прикручу, временные таблицы, непременно курсор, динамику, xml и пару недокументированных фишек!! =)
10
23 января 2011 года
Freeman
3.2K / / 06.03.2004
Цитата: SomewherSomehow
Вроде там другой вариант, ага?=)


Похоже, у меня синдром рассеянного внимания. Интересное допущение, что городов 'E' и 'N' нет. Но вариант с ascii всё же нагляднее.

Случай из жизни. Пишу скрипт для автоматического выполнения задания по расписанию. Спрашиваю у коллеги: "Если напишу trunc(sysdate) + 0.25, тебе будет понятно, что это шесть утра?". Решили всё же написать trunc(sysdate) + 6/24. :)

В этом свете, возможно, стоило бы переписать оригинальный вариант так:
[highlight=sql]select city from cust
where city between chr(ascii('F') - 1) and chr(ascii('M') + 1)[/highlight]

Если входные буквы будут передаваться как параметры, по-другому точно никак.

Цитата: SomewherSomehow
Кстати, зачем проверять на оракл, когда речь шла о mssql? =)


Сервера с MS SQL под рукой нет. Полагаю, что функции всё же стандартные.

Цитата: SomewherSomehow
Если соревнование по количеству строк будет продолжаться, дайте срок, я вам еще тут рекурсивное cte как-нить прикручу, временные таблицы, непременно курсор, динамику, xml и пару недокументированных фишек!! =)


Ну, это да. На Oracle можно тоже с nlssort написать. Но думаю, что всё же не стоит.

385
23 января 2011 года
SomewherSomehow
477 / / 25.07.2004
Если диапазоны передаются в параметрах, тоже нет нужды изобретать велосипед, просто вместо литеральных констант подставить параметры.
Код:
declare @cust table(city varchar(100))
insert into @cust
select 'Ashgabat'  union ALL
select 'Astana'  union ALL
select 'Baki'  union ALL
select 'Bishkek'  union ALL
select 'Chisinau'  union ALL
select 'Dushanbe'  union ALL
select 'Kyiv'  union ALL
select 'Minsk'  union ALL
select 'Moscow'  union ALL
select 'Riga'  union ALL
select 'Tallinn'  union ALL
select 'Tashkent'  union ALL
select 'Tbilisi'  union ALL
select 'Vinlius'  union ALL
select 'Yerevan';

declare @StartSymbol char(1), @EndSymbol char(1)
select @StartSymbol = 'F', @EndSymbol = 'N'
select city from @cust where city >= @StartSymbol AND city < @EndSymbol
Фактически с использованием функции ascii можно добиться того же самого, только я вижу два недостатка
- для каждой записи в таблице будет лишний раз вызвана эта функция, т.е. возрастет нагрузка на процессор (очень незначительно есессно)
- исхоный код приобретет некоторую избыточность
Впрочем, если кому-то так нагляднее, то оно конечно может быть, но лично мне милее стандартное использование, просто надо помнить как сравниваются строки.
10
23 января 2011 года
Freeman
3.2K / / 06.03.2004
Посчитал, что использование between было условием задачи. Like сюда ну никак.

В реальной задаче, конечно, вряд ли бы написал так, если бы не было других соображений. Вариант с >= < -- самый практически оправданный.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог