在SQL中使用整数

时间:2011-04-22 11:26:23

标签: sql sql-server sql-server-2005 sql-like

我可以将=语句替换为LIKE语句,用于整数吗?

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

select * from FOOS where FOOID like 2    
// and 
select * from FOOS where FOOID = 2

我更倾向于使用LIKE代替=,因为当我没有FOOID过滤器时我可以使用% ...

SQL Server 2005。

编辑1 @Martin
enter image description here

5 个答案:

答案 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

计划(注意估计的费用)

enter image description here

另一种看待成本差异的方法是添加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)