SQL - где критерии для поиска имен между A-F

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

Мне нужно решение, чтобы я мог найти, скажем, имена, между A-F, включая все имена, начинающиеся с F.

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

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

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

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

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

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

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

 Adrian Iftode27 мар. 2012 г., 18:06
для какого сервера?
 ActiveX27 мар. 2012 г., 18:12
SQL Server 2000 или более поздняя версия

Ответы на вопрос(5)

Насколько проще вы можете сделать это?

WHERE NAME LIKE '[a-f]%'
 ActiveX27 мар. 2012 г., 18:56
Будет работать только с одним символом. Не с диапазонами, такими как: A-Fa, A-Fb. Я не был явно в моем вопросе, я прошу прощения. Я отредактировал свой вопрос и добавил больше деталей.

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

WHERE SUBSTR(name, 1, 1) >= 'A' AND SUBSTR(name, 1, 1) <= 'F'
 MatBailie27 мар. 2012 г., 18:22
@ActiveX - Что вы имеете в виду использование может спецификаA - Fxxx? Это существенно меняет поведение, которое вы описали в своем вопросе. Не могли бы вы обновить вопрос, включив в него все необходимые функции?
 ActiveX27 мар. 2012 г., 18:26
Я прошу прощения: 2 текстовых поля, которые принимают диапазон, который может ввести пользователь. Если пользователь уточняет, как далеко зайти в F, как таковой: Пользователь вводит в «Fa» означает Fauder, Fail, Famber.
 ActiveX27 мар. 2012 г., 18:18
Неплохо. Это будет работать, но требует больше программирования. В моем случае пользователь может уточнить поиск: A - Fs или A Fxxx. Я мог бы использовать ваш подход и написать некоторый код, чтобы вычислить длину поля 2-й границы и передать ее в substr, но она становится грязной.
 MatBailie27 мар. 2012 г., 18:19
Работает, но ставит функцию по всемуname поле предотвращает поиск индекса и приводит к полному сканированию.

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

WHERE name >= 'A' AND name < 'G'
 Lamak27 мар. 2012 г., 18:14
@ActiveX - Что вы подразумеваете под "формулой"? Какие параметры ожидаются для вашего запроса? И нет, он не вернет имя, котороеG.
 MatBailie27 мар. 2012 г., 18:18
@ActiveX - это использует< скорее, чем<= или жеBETWEEN, Это очень нормальный и мощный шаблон, которому все равно, сколько символов вname или требуют каких-либо функций наname поле (что важно, так как такие функции разрушают возможность использования поиска диапазона индекса). Лично это именно то, что я бы использовал.
 ActiveX27 мар. 2012 г., 18:12
Только если бы мы могли жестко кодировать вещи. Я ищу формулу. Выше также вернет имя, которое является «G», что является неправильным.
 Aheho27 мар. 2012 г., 18:19
Этот ответ предпочтительнее, потому что более вероятно, что он может использовать индексы. Если вы используете функцию substr (), вы, скорее всего, получите сканирование таблицы.
 ActiveX27 мар. 2012 г., 18:25
@Lamak: Формула, поэтому она работает с различными параметрами. Вы жестко закодировали значения в предложении WHERE. Ожидаемые параметры хранимой процедуры будут строками, я просто использовал жестко закодированные значения для упрощения моих вопросов. Да, он вернет имя «G», это способ работы оператора, включая внешний предел, который равен G. Так что если ваше имя «G», он будет возвращен.

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

select * 
from MyTable
where left(name, 1) between 'a' and 'f'
 MatBailie27 мар. 2012 г., 18:19
Работает, но ставит функцию по всемуname поле предотвращает поиск индекса и приводит к полному сканированию.
Решение Вопроса

чтобы включить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 + '%')


РЕДАКТИРОВАТЬ

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

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

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

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

 ActiveX27 мар. 2012 г., 18:47
Это именно то, что я искал! Большое спасибо и спасибо всем за ответы.

Ваш ответ на вопрос