我可以将=
语句替换为LIKE
语句,用于整数吗?
通过例如。以下是相同的事情:
select * from FOOS where FOOID like 2
// and
select * from FOOS where FOOID = 2
我更倾向于使用LIKE
代替=
,因为当我没有FOOID过滤器时我可以使用%
...
SQL Server 2005。
编辑1 @Martin
答案 0 :(得分:19)
select * from FOOS where FOOID like 2
应避免,因为它会导致双方被隐式转换为varchar
,并且意味着索引不能用于满足查询。
CREATE TABLE #FOOS
(
FOOID INT PRIMARY KEY,
Filler CHAR(1000)
)
INSERT INTO #FOOS(FOOID)
SELECT DISTINCT number
FROM master..spt_values
SELECT * FROM #FOOS WHERE FOOID LIKE 2
SELECT * FROM #FOOS WHERE FOOID = 2
DROP TABLE #FOOS
计划(注意估计的费用)
另一种看待成本差异的方法是添加SET STATISTICS IO ON
您看到第一个版本返回类似
的内容Table '#FOOS__000000000015'. Scan count 1, logical reads 310
第二个版本返回
Table '#FOOS__000000000015'. Scan count 0, logical reads 2
这是因为此索引上的搜索所需的读取与索引深度成比例,而扫描所需的读取与索引中的页数成比例。表格越大,这两个数字之间的差异就越大。您可以通过运行以下内容来查看这两个数字。
SELECT index_depth, page_count
FROM
sys.dm_db_index_physical_stats (2,object_id('tempdb..#FOOS'), DEFAULT,DEFAULT, DEFAULT)
WHERE object_id = object_id('tempdb..#FOOS') /*In case it hasn't been created yet*/
答案 1 :(得分:5)
使用CASE
语句将输入字符串转换为整数。将通配符%
转换为NULL
。这将比将整个int列隐式转换为字符串提供更好的性能。
CREATE PROCEDURE GetFoos(@fooIdOrWildcard varchar(100))
AS
BEGIN
DECLARE @fooId int
SET @fooId =
CASE
-- Case 1 - Wildcard
WHEN @fooIdOrWildcard = '%'
THEN NULL
-- Case 2 - Integer
WHEN LEN(@fooIdOrWildcard) BETWEEN 1 AND 9
AND @fooIdOrWildcard NOT LIKE '%[^0-9]%'
THEN CAST(@fooIdOrWildcard AS int)
-- Case 3 - Invalid input
ELSE 0
END
SELECT FooId, Name
FROM dbo.Foos
WHERE FooId BETWEEN COALESCE(@fooId, 1) AND COALESCE(@fooId, 2147483647)
END
答案 2 :(得分:3)
是的,您可以使用它:
SELECT *
FROM FOOS
WHERE FOOID like 2
或
SELECT *
FROM FOOS
WHERE FOOID like '%'
整数将被隐式转换为字符串。
请注意,这些条件都不是可以理解的,i。即能够在fooid
上使用索引。这将始终导致全表扫描(或fooid
上的完整索引扫描)。
答案 3 :(得分:2)
这是一个迟到的评论,但我想也许其他人正在寻找同样的事情,因为我能够找到解决方案,我想我应该在这里分享:)
问题的简短描述: 我遇到的问题是能够使用外卡整数数据类型。我使用的是SQL Server,因此我的语法适用于SQL Server。我有一个显示部门编号的列,我想从下拉菜单中传递我的页面中的变量。还有一个'All'选项,在这种情况下我想传递'%'作为参数。我正在使用它:
select * from table1 where deptNo Like @DepartmentID
当我传递一个数字而不是%
时,它正在工作,因为sql server隐式地将@DepartmentID
转换为int(因为我的deptNo是int类型)
所以我投下了deptNo并解决了这个问题:
select * from table1 where CAST(deptNo AS varchar(2)) Like @DepartmentID
当我传递像4这样的数字时,以及当我通过%
时,这个都适用。
答案 4 :(得分:1)
使用NULL作为参数值而不是通配符条件的%
select * from table1 where (@DepartmentID IS NULL OR deptNo = @DepartmentID)