SQL-запрос для критериев поиска - PullRequest
0 голосов
/ 02 апреля 2012

В моей таблице есть коды, которые в основном являются десятичными значениями. Например, столбец кода содержит данные типа 001.0, 00.10, 002.0, 00.20 и т. Д. Я должен написать запрос SQL, который показывает следующий результат при поиске значений кода из пользовательского интерфейса:

  • Если пользователь ищет 0010, я должен показать все значения 001.0, 00.10

  • если пользователь ищет 001.0, я должен показать такие значения, как 001.0, 001.1 и т. Д.

  • если пользователь ищет 00.10, я должен показать значение 00.10, 00.12 и т. Д.

Пожалуйста, помогите мне в написании SQL-запроса по вышеуказанным критериям.

1 Ответ

1 голос
/ 02 апреля 2012

Не все полностью ясно в ваших правилах, но я надеюсь, что следующее послужит вам, по крайней мере, сносной отправной точкой.

По-видимому, поисковый термин должен обрабатываться двумя способами, в зависимости от того, содержит ли он десятичную точку. Итак, сначала вам нужно знать, присутствует ли точка или нет. Это можно сделать с помощью функции CHARINDEX(): если она возвращает 0, десятичная точка отсутствует в поисковом запросе, в противном случае она там есть. Таким образом, ваше полное состояние будет структурировано так:

WHERE CHARINDEX('.', @SearchTerm) = 0 AND … /* condition to match '0010'-like input */
   OR CHARINDEX('.', @SearchTerm) > 0 AND … /* condition to match input containing '.' */

Условие поиска термина без . может выглядеть следующим образом:

REPLACE(Code, '.', '') = @SearchTerm  /* or maybe LIKE @SearchTerm + '%'? */

Условие для случая, когда поисковый термин содержит ., кажется мне более хитрым, чем предыдущий, но в любом случае вот что я придумал:

Code LIKE REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0') + '%'

Как это работает, шаг за шагом, используя '001.0' и '00.10' в качестве примеров:

Initial value                                                   '001.0'  '00.10'
REPLACE(@SearchTerm, '0', ' ')                                  '  1. '  '  .1 '
RTRIM(REPLACE(@SearchTerm, '0', ' '))                           '  1.'   '  .1'
REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0')        '001.'   '00.1'
REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0') + '%'  '001.%'  '00.1%'

Итак, как вы можете видеть, выражение оценивается как маска, которая должна соответствовать вашим правилам для поисковых терминов, содержащих ..

Собрав все условия вместе, мы получим следующее предложение WHERE:

WHERE CHARINDEX('.', @SearchTerm) = 0 AND REPLACE(Code, '.', '') = @SearchTerm
   OR CHARINDEX('.', @SearchTerm) > 0 AND
      Code LIKE REPLACE(RTRIM(REPLACE(@SearchTerm, '0', ' ')), ' ', '0') + '%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...