SQL Server, как для целых - PullRequest
2 голосов
/ 28 мая 2010

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

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

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

Ответы [ 7 ]

3 голосов
/ 28 мая 2010

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

3 голосов
/ 28 мая 2010

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 голосов
/ 28 мая 2010
LEFT(CONVERT(varchar, accountid),4)="1500"
2 голосов
/ 28 мая 2010

Если вы знаете минимальные и максимальные значения для вашего столбца, вы можете сделать это:

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)))
1 голос
/ 28 мая 2010

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

НТН

1 голос
/ 28 мая 2010

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

0 голосов
/ 16 марта 2014
 select columnname from dbo.TB
        where CONVERT(varchar(20), columnname )  like '15'+'%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...