SQL Server LIKE for Integer


У меня есть столбец, который является целым числом, и я хочу найти все числа, начиная с 1500.

Я знаю, что мог бы использовать что-то вроде left(accountid, 4)= 1500.

Но является ли это оптимальным решением или есть лучший подход? Я использую SQL Server 2005.
7 2

7 ответов:

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

select
   stuff
from 
   table
where
   (number = 1500) 
or (number >= 15000 and number <= 15009) 
or (number >= 150000 and number <= 150099)
or (number >= 1500000 and number <= 1500999)
or (number >= 15000000 and number <= 15009999)
-- add however many statements you need.

Или, если вы не знаете минимумов и максимумов, вы можете сделать следующее:

...
where
    (number - 1500*POWER(10, FLOOR(LOG10(number) - 3))) 
    < (POWER(10, FLOOR(LOG10(number) - 3)))
LEFT(CONVERT(varchar, accountid),4)="1500"

INT - это INT - это просто числовое значение. INT не "выглядит" как какое-то строковое значение..... если вы хотите сравнить с LIKE, вам нужна строка - вам нужно преобразовать INT в строку, чтобы иметь возможность сделать это.

Если вам нужно искать и сравнивать с этим строковым представлением вашего INT много, я бы рекомендовал сделать его вычисляемым, сохраняемым столбцом в вашей таблице:

ALTER TABLE dbo.YourTable
   ADD IntString AS LEFT(CAST(YourInt AS VARCHAR(20)), 4) PERSISTED

Таким образом, вы получаете новый столбец, который имеет значение внутри него, это значение всегда в курсе, это сохраненный столбец, вы можете проиндексировать его при необходимости - вы получаете все преимущества сравнения вашего " int " с оператором LIKE: -)

Если вы хотите обменять место для хранения данных на скорость работы, я бы добавил сохраненный вычисляемый столбец в таблицу, содержащую строковую версию целого числа, индексируйте соответствующим образом и используйте этот столбец для поиска.

Если вы хотите пойти еще дальше, почему бы не создать подобие супер-категории для учетных записей, и это исключило бы необходимость выполнять LEFT() на преобразованном varchar из целого числа. Чтобы уточнить, если вы знаете, что все счета, начинающиеся с id 1500, являются, скажем, счетами, связанными с продажами, вы можете иметь супер категорию 1500 для всех из них. Это, конечно, применимо только в том случае, если эта иерархическая связь существует =).

Все зависит от объема данных. Если вы говорите о миллионах записей, то использование left with convert не будет быстрым. Наилучший возможный вариант-иметь вычисляемый столбец, в котором хранятся первые четыре цифры, и вы делаете поиск непосредственно из него, это будет самым быстрым. Но каждая вставка или обновление займет немного больше времени. Так что все зависит от того, с каким количеством строк вы имеете дело.

HTH

 select columnname from dbo.TB
        where CONVERT(varchar(20), columnname )  like '15'+'%'