Как с целыми числами, в SQL - PullRequest
22 голосов
/ 22 апреля 2011

Могу ли я заменить оператор = на 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 ]

19 голосов
/ 22 апреля 2011
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*/
5 голосов
/ 22 апреля 2011

Используйте оператор 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
3 голосов
/ 22 апреля 2011

Да, вы можете просто использовать его:

SELECT  *
FROM    FOOS
WHERE   FOOID like 2   

или

SELECT  *
FROM    FOOS
WHERE   FOOID like '%'  

Целые числа будут неявно преобразованы в строки.

Обратите внимание, что ни одно из этих условий не может быть саргусным, т.е. е. возможность использовать индекс на fooid. Это всегда приводит к полному сканированию таблицы (или полному сканированию индекса на fooid).

2 голосов
/ 15 августа 2012

Это поздний комментарий, но я подумал, что, возможно, некоторые другие люди ищут то же самое, чтобы найти решение для этого, я подумал, что должен поделиться им здесь:)

Краткое описание проблемы: проблема, с которой я столкнулся, состояла в том, чтобы иметь возможность использовать подстановочные знаки для целочисленных типов данных. Я использую SQL Server, и поэтому мой синтаксис для SQL Server. У меня есть столбец, который показывает номер отдела, и я хотел передать переменную со своей страницы из выпадающего меню. Также есть опция «Все», в которой я хотел передать «%» в качестве параметра. Я использовал это:

select * from table1 where deptNo Like @DepartmentID

Это работало, когда я передаю число, но не для %, потому что сервер sql неявно преобразует @DepartmentID в int (так как мой deptNo имеет тип int)

Итак, я разыграл deptNo, и это решило проблему:

select * from table1 where CAST(deptNo AS varchar(2)) Like @DepartmentID

Этот работает для обоих, когда я передаю число, подобное 4, и когда я передаю %.

1 голос
/ 30 апреля 2015

Используйте NULL в качестве значения параметра вместо% для условия подстановочного знака

select * from table1 where (@DepartmentID IS NULL OR deptNo = @DepartmentID)
...