Совместное использование оператора BETWEEN и LIKE
- который выдает ошибку: 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.
Подскажите ,где я ошибся. В заранее огромное спасибо.
так попробуй
Дальше вспоминаем сравнение SQL строк и понимаем, что строка Last, например, лежит таки между F и M.
т.е.
?
т.е.
?
Не взлетит. Возвратит города, которые начинаются на F и M, а не города между ними.
тогда поидее так
он написал, что не помоголо. ну разве что он не убрал эти самые кавычки.
тогда поидее так
Нет же. Ему нужны города от F до M.
Алсо, в предыдущем посте написал, что
будет работать, что не верно. Скорее всего не съест эту часть
T-SQL
what is this?
Небось функция возвращающая ASCII код символа переданного в кач-ве параметра. :)
...первого! символа параметра.
И зачем оно здесь надо, можете объяснить? Абсолютно бесполезно.
Не за чем извлекать первый символ, если 'a' всегда меньше 'aa', 'ab' и т.д.
Если требуется найти
(и считаем, что города начинающиеся с М - включаем), то искомое даст вариант
А использование ascii говорит только о том, что автору кода неиззвестно, как идет сравнение символьных строк.
Кстати, вариант hardcase, имхо лучший из предложенных, т.к. иллюстрирует принцип сравнения, пусть и немного неточен в самом условии, но этот вариант уж точно не подталкивает к использованию ascii и вайлдкардсов.
Upd:
Я так понял этот ответ адресуеся не Freeman, а тому кто работал вместо него =)
Подготовка:
[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]
------
Kyiv
Вариант freets:
[highlight=sql]
select city from cust
where ascii(city) between ascii('F') and ascii('M')
[/highlight]
--------
Kyiv
Minsk
Moscow
Ч. т. д.
Похоже, это неизвестно тому, кто работает вместо меня. :p
Вариант hardcase:
[highlight=sql]
select city from cust
where city between 'F' and 'M'
[/highlight]
------
Kyiv
Вроде там другой вариант, ага?=)
Ну и потом, что выдаст нормальный вариант из моего предыдущего поста, без функции ansii?
Кстати, зачем проверять на оракл, когда речь шла о mssql? =)
(хотя я думаю и то, и то - удовлетворяет в сравнении строк требованиям стандарта, так что тем более нет смысла использовать лишние функции)
Хотя конечно если кто-то привык "в гамаке и стоя"...в общем, вот мой вариант для mssql
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 и пару недокументированных фишек!! =)
Похоже, у меня синдром рассеянного внимания. Интересное допущение, что городов '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]
Если входные буквы будут передаваться как параметры, по-другому точно никак.
Сервера с MS SQL под рукой нет. Полагаю, что функции всё же стандартные.
Ну, это да. На Oracle можно тоже с nlssort написать. Но думаю, что всё же не стоит.
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
- для каждой записи в таблице будет лишний раз вызвана эта функция, т.е. возрастет нагрузка на процессор (очень незначительно есессно)
- исхоный код приобретет некоторую избыточность
Впрочем, если кому-то так нагляднее, то оно конечно может быть, но лично мне милее стандартное использование, просто надо помнить как сравниваются строки.
В реальной задаче, конечно, вряд ли бы написал так, если бы не было других соображений. Вариант с >= < -- самый практически оправданный.