2010-05-27 2 views
2

У меня есть столбец, который является целым числом, и я хочу, чтобы найти все номера, начинающиеся с 1500.SQL Server LIKE для Integer

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

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

+2

какой тип столбца? Вы говорите, что это целое число, но вы подразумеваете использование строковой функции. – mdma

+0

И если это целочисленный тип, все числа имеют одинаковую длину? например 1500123, 1500751 и т. Д. –

+0

@mdma - это была моя точка. Столбец целых чисел, но я хочу сделать на нем строку типа операции. @ Мартин-кузнец - нет – Prashant

ответ

2

Предполагая, что вы знаете, минимальные и максимальные значения для вашей колонки, вы можете сделать это:

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))) 
3
LEFT(CONVERT(varchar, accountid),4)="1500" 
+3

... но, это не обязательно будет быстро. –

1

Если вы хотите пойти еще дальше, почему бы не создать как супер категории для счетов и исключит необходимость выполнения ВЛЕВО() на переоборудованном VARCHAR из целого , Чтобы уточнить, если вы знаете, что все учетные записи, начинающиеся с идентификатора 1500, говорят, учетные записи, связанные с продажами, у вас может быть супер категория 1500 для всех из них. Это, безусловно, применимо только в том случае, если существует такое иерархическое соотношение =).

1

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

НТН

3

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

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

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

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

3

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

0
select columnname from dbo.TB 
     where CONVERT(varchar(20), columnname) like '15'+'%' 
Смежные вопросы