Не все полностью ясно в ваших правилах, но я надеюсь, что следующее послужит вам, по крайней мере, сносной отправной точкой.
По-видимому, поисковый термин должен обрабатываться двумя способами, в зависимости от того, содержит ли он десятичную точку. Итак, сначала вам нужно знать, присутствует ли точка или нет. Это можно сделать с помощью функции 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') + '%'