在SQL中使用整数

ser*_*hio 23 sql sql-server sql-server-2005 sql-like

我可以更换= 与声明LIKE一个整数

通过例如.是以下相同的事情:

select * from FOOS where FOOID like 2    
// and 
select * from FOOS where FOOID = 2
Run Code Online (Sandbox Code Playgroud)

我宁愿使用LIKE而不是=因为%当我没有FOOID过滤器时我可以使用...

SQL Server 2005.

编辑1 @Martin
在此输入图像描述

Mar*_*ith 19

select * from FOOS where FOOID like 2
Run Code Online (Sandbox Code Playgroud)

应该避免,因为它会导致双方被隐式地转换为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
Run Code Online (Sandbox Code Playgroud)

计划(注意估计费用)

在此输入图像描述

另一种看待成本差异的方法是增加 SET STATISTICS IO ON

你看到第一个版本返回类似的东西

Table '#FOOS__000000000015'. Scan count 1, logical reads 310
Run Code Online (Sandbox Code Playgroud)

第二个版本返回

Table '#FOOS__000000000015'. Scan count 0, logical reads 2
Run Code Online (Sandbox Code Playgroud)

这是因为对该索引的搜索所需的读取与索引深度成比例,而扫描所需的读取与索引中的页面数成比例.表格越大,这两个数字之间的差异就越大.您可以通过运行以下内容来查看这两个数字.

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*/
Run Code Online (Sandbox Code Playgroud)

  • @serhio - 绝对不是因为它不需要在`id`列上执行直接索引查找,而是需要扫描所有行. (4认同)

Ant*_*ull 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
Run Code Online (Sandbox Code Playgroud)