SQL - поиск по типу (Int & VarChar) - PullRequest
0 голосов
/ 25 марта 2019

Я хочу выполнить комбинированный поиск по фиксированным, известным ссылкам (Int), а также по подстановочным знакам (varchar) в разных столбцах.

Мой целочисленный поиск работает нормально, но при поиске varchar (LIKE)завершается с ошибкой преобразования varchar в int.

WHERE
MyID = 1 AND MyRef = @Search OR
MyID = 1 AND MyName LIKE N'%' + @Search + N'%'

Я предполагаю, что сбой происходит, когда SQL ищет varchar для int (MyRef)

Где я ошибся?заранее спасибо

Ответы [ 4 ]

1 голос
/ 25 марта 2019

Простой метод - использовать concat():

WHERE MyID = 1 AND
      ( MyRef = @Search OR
        MyName LIKE CONCAT('%', @Search , '%')
      )

Однако что-то в этом не кажется удобным.Вы действительно хотите один и тот же термин поиска для обоих полей?

1 голос
/ 25 марта 2019

Возвращает ли это ожидаемый результат?

where MyId = 1 and 
case isnumeric(@search) when 1 then 
       case when myRef = @search then 1 else 0 end
   else 
       case when MyName like N'%' + @search + N'%' then 1 else 0 end
   end = 1

или

where MyId = 1 and 
case try_cast(@search as int) when is not null then 
       case when myRef = @search then 1 else 0 end
   else 
       case when MyName like N'%' + @search + N'%' then 1 else 0 end
   end = 1
1 голос
/ 25 марта 2019

SQL Server будет пытаться неявно преобразовывать строки в числа всякий раз, когда вы сравниваете, перемещаете или объединяете число в строку.Чтобы избежать этого, вы должны явно преобразовать число в строку:

WHERE MyId = 1 
AND 
(
    MyRef = @Search 
    OR MyName LIKE N'%' + CAST(@Search as varchar(11)) + N'%'
)

Я использую varchar(11), потому что он достаточно большой, чтобы содержать минимальное значение int, включая знак минус.Если число относится к другому типу, вы можете выбрать другой размер.

Я также немного изменил ваши условия - нет смысла иметь одно и то же условие несколько раз, а также, этоВсегда полезно использовать круглые скобки при объединении and и or в одном и том же предложении where.

0 голосов
/ 01 апреля 2019

Спасибо всем. Я решил не объединять все параметры поиска в один, вместо этого я разделил поиск по ссылкам и поиск по тексту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...