2008-09-30 2 views
5

Мне нужно добавить возможность пользователям моего программного обеспечения выбирать записи по диапазонам символов.
Как написать запрос, который возвращает все виджеты из таблицы, чье имя попадает в диапазон Ba-Bi?Каков наилучший способ выбора строковых полей на основе диапазонов символов?

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

select * from widget 
where name >= 'ba' and name < 'bj' 

Обратите внимание, как я «инкрементируется» последний символ верхней границы от I до J, так что «велосипед» не будет забыт.

Существует ли общий способ поиска следующего символа после заданного символа на основе сопоставления поля или было бы безопаснее создать второе условие?

select * from widget 
where name >= 'ba' 
and (name < 'bi' or name like 'bi%') 

Мое приложение должно поддерживать локализацию. Насколько чувствителен этот тип запросов к различным наборам символов?

Мне также нужно поддерживать как MSSQL, так и Oracle. Каковы мои варианты обеспечения того, чтобы оболочка символов игнорировалась независимо от того, какой язык отображается в данных?

ответ

3

Давайте перейти непосредственно к локализации. Вы скажете «aa»> = «ba»? Наверное, нет, но именно там он сортируется в Швеции. Кроме того, вы просто не можете предположить, что вы можете игнорировать оболочку на любом языке. Корпус явно зависит от языка, наиболее распространенным примером которого является турецкий: uppercase i is İ. Нижний регистр Я ı.

Теперь ваша SQL-база данных определяет результат <, == и т. Д. Посредством «порядка сортировки». Это определенно зависит от языка.Таким образом, вы должны явно контролировать это для каждого запроса. Турецкий порядок сортировки поместит те, где они принадлежат (на турецком языке). Вы не можете полагаться на сортировку по умолчанию.

Что касается «приращения части», не беспокойтесь. Придерживайтесь> = и < =.

0

Для MSSQL см. Эту тему: http://bytes.com/forum/thread483570.html.

Для Oracle, это зависит от версии Oracle, поскольку Oracle 10 теперь поддерживает регулярные выражения (р), как запросы: http://www.psoug.org/reference/regexp.html (поиск REGEXP_LIKE) и в этой статье: http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html

HTH

0

Разочаровывающе, то Функция подстроки Oracle - SUBSTR(), а SQL-сервер - SUBSTRING().

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

Тогда вы можете просто использовать

MY_SUBSTRING(name, 2) >= 'ba' AND MY_SUBSTRING(name, 2) <= 'bi' 

или аналогичный.

0

Вы могли бы использовать это ...

select * from widget 
where name Like 'b[a-i]%' 

Это будет соответствовать любой строке, где имя начинается с Ь, второй символ находится в диапазоне от А до Я, и любые другие символы следуют.

+0

Я считаю, по крайней мере, в MySQL это было бы «rlike», а не «как». – pilsetnieks 2008-09-30 12:24:52

0

Я думаю, что я бы пошел с чем-то простым, например, добавив строку с высокой сортировкой в ​​конец верхней границы. Что-то вроде:

select * from widgetwhere name >= 'ba' and name <= 'bi'||'~' 

Я не уверен, что выживут EBCDIC преобразование хотя

0

Вы также можете сделать это следующим образом:

select * from widget 
where left(name, 2) between 'ba' and 'bi' 

Если изменения длины ваши критерии (как вы, казалось, чтобы указать в комментарии вы слева), запрос должен был бы иметь длину в качестве вклада также:

declare @CriteriaLength int 
set @CriteriaLength = 4 
select * from widget 
where left(name, @CriteriaLength) between 'baaa' and 'bike'