SQL - где критерии для поиска имен между AF - PullRequest
5 голосов
/ 27 марта 2012

Простой вопрос:

Мне нужно решение, чтобы я мог найти, скажем, имена, между AF, ВКЛЮЧАЯ все имена, начинающиеся с F.

Если вы используете BETWEEN или A>= значение <= F вы обнаруживаете, что он останавливается на F. Поэтому я отправляю это для предложений. </p>

ПРИМЕЧАНИЕ. Пользователь увидит 2 текстовых поля, в которых можно ввести диапазон, который может ввести пользователь.Пользователь уточняет, как далеко зайти в границу F, следующим образом: пользовательские типы в «Fa» означают, что результат должен вернуть: Fauder, Fail, Famber, ... и т. Д.

У меня есть 2 решения, ноесть лучший способ.

Решение 1: Это добавит 1 к внешней границе, но может включать результат, если есть имя, которое является единственным 'G', хотя очень маловероятно.ГДЕ имя> = 'A' И <= CHAR (ASCII ('F') + 1) </p>

Решение 2: Это решение добавляет последнюю букву раз длины поля алфавита.ГДЕ имя> = 'A' И <= 'FZZZZZZZZZZZZZZZZZZZZ * </p>

Хотя вышеприведенные решения работоспособны, мой поиск можно уточнить следующим образом: от A до Fs (должен дать мне все, от A до и включая Fs ....).С этим решением # 1 не работает, так как он работает с одним ASCII.

Предложения приветствуются.

Ответы [ 5 ]

9 голосов
/ 27 марта 2012

Вы можете сделать:

WHERE name >= 'A' AND name < 'G'
4 голосов
/ 27 марта 2012

Как насчет этого?

WHERE SUBSTR(name, 1, 1) >= 'A' AND SUBSTR(name, 1, 1) <= 'F'
2 голосов
/ 27 марта 2012

Насколько проще это сделать?

WHERE NAME LIKE '[a-f]%'
2 голосов
/ 27 марта 2012

Будет ли это работать для вас:

select * 
from MyTable
where left(name, 1) between 'a' and 'f'
1 голос
/ 27 марта 2012

В комментарии вы расширяете требование, чтобы включить A - Fxxx.

SET @start = 'A'
SET @end   = 'Fxxx'

SELECT
  *
FROM
  table
WHERE
  (name >= @start AND name < @end)
  OR (name LIKE @end + '%')

Обратите внимание, что это не включает функции в поле name; такие функции предотвращают поиск диапазона по индексам. Однако включение OR также ухудшает поиск по индексу. Хотя это дополнительный код, в некоторых случаях это может быть более производительным ...

SELECT
  *
FROM
  table
WHERE
  (name >= @start AND name < @end)

UNION ALL

SELECT
  *
FROM
  table
WHERE
  (name LIKE @end + '%')

1011 *
*

EDIT

Оглядываясь назад, ваше Решение 2 , хотя вам это не нравится, вероятно, лучше.

Поворот Fxxx на FxxxZZZZZZZZZZ достаточно просто с STUFF(), при условии, что вы знаете максимальную длину строки, которую вы должны сделать, так как база данных ваша.

У него нет никаких функций в поле name, и он не использует OR в предложении WHERE. Это означает, что вы получаете чистый диапазон поиска по любому индексу.

Производительность мудрая, я не думаю, что вы можете улучшить это.

...