Как ВЫБРАТЬ строки против фильтра RANGE на основе чисел в столбце varchar? - PullRequest
1 голос
/ 02 декабря 2011

Если у меня есть столбец varchar, имеющий длину 30:

[SpecificCode] -> varchar (30) в таблице БД, которая называется [Item]

И если мне нужно запросить строки этой таблицы, чтобы получить все строки, которые имеют

SpecificCode между 789 и 15000

Какой может быть самый быстрый способ SELECT в TSQL?(Проверка дальности необходима на поле varchar длиной 30)

SELECT *
FROM Item
WHERE Item.SepecificCode --how to filter between 789 and 15000?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Предполагая, что столбец полон нецифрового мусора, но без десятичных дробей

SELECT *
FROM Item
WHERE
    RIGHT('00' + Item.SpecificCode, 5) BETWEEN '789' and '15000'
    AND
    ISNUMERIC(Item.SpecificCode) = 1;

Если только целые числа

SELECT *
FROM Item
WHERE
    CAST(Item.SpecificCode AS int) BETWEEN 789 and 15000;

Если тоже с плавающей точкой:

SELECT *
FROM Item
WHERE
    CAST(Item.SpecificCode AS float) BETWEEN 789 and 15000
    AND
    FLOOR(CAST(Item.SpecificCode AS float)) = CAST(Item.SpecificCode AS int)
0 голосов
/ 02 декабря 2011

Попробуйте заставить sql читать столбец как INT

SELECT * FROM Item WHERE Item.SepecificCode+0 between 789 and 15000;

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

EXPLAIN SELECT * FROM Item WHERE Item.SepecificCode+0 between 789 and 15000;
0 голосов
/ 02 декабря 2011

Было бы что-то вроде этого:

SELECT *
FROM Item
WHERE cast(Item.SepecificCode as integer) >= 789 and cast(Item.SepecificCode as interger) <= 15000

, но для повышения производительности вы должны создать index в столбце SepecificCode.

...