SQL-根据类型进行搜索(Int和VarChar)

时间:2019-03-25 16:20:05

标签: sql-server tsql

我希望基于固定的已知引用(Int)和通配符(varchar)在不同列上进行组合搜索。

我的整数搜索工作正常,但通过varchar(LIKE),搜索失败,并出现从varchar到int转换的错误。

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

我假设失败是当SQL针对int(MyRef)搜索varchar时

我哪里出错了? 预先感谢

4 个答案:

答案 0 :(得分:1)

每当您比较,移动或将数字连接到字符串时,SQL Server都会尝试implicitly convert strings to numbers。 为了避免这种情况,您必须将数字明确转换为字符串:

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

我正在使用varchar(11),因为它足够大,可以容纳int的最小值,包括负号。如果数字的类型不同,则可能要选择其他大小。

我也对您的条件进行了一些重新排列-多次具有相同的条件是没有意义的,而且,在同一位置组合andor时,最好使用括号where子句。

答案 1 :(得分:1)

一种简单的方法是使用{=SUMIF(A2:A7,TEXTJOIN(",",TRUE,IF(D2:D7=G2,E2:E7,"")),B2:B7)}

concat()

但是,对此似乎有些不满意。您是否真的希望两个字段都使用相同的搜索词?

答案 2 :(得分:1)

这会返回预期的结果吗?

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

答案 3 :(得分:0)

谢谢大家。 我决定不将所有搜索参数合并为一个,而是将参考搜索和文本搜索分开。