Для всех натуральных чисел> = 10 вы можете сделать это без необходимости использования TEXT / VARCHAR:
SELECT * FROM "table"
WHERE $1 = id / (10 ^ (floor(log(id)-1)))::integer
Вы также можете индексировать это:
CREATE INDEX idx_table_2_digits
ON "table" ( 10 / (id ^ (floor(log(id)-1)))::integer);
Расчетв основном работает так:
- Найдите наибольшую степень 10, которая меньше заданного идентификатора (назовем это X).
- Уменьшите величину X на единицу (так как мынужно две цифры)
- Поднимите 10 до степени X и приведите к результату тип INTEGER (чтобы последний шаг был SQL DIV вместо деления с плавающей запятой).
- DIVисходный идентификатор на 10 ^ x, чтобы получить первые две цифры.
Этот алгоритм можно даже обобщить в функцию, f (x, y), где x - это идентификатор, а y - этоколичество старших цифр для возврата:
# python-esque pseudocode:
def integer_leading_digits (id, digits):
if id < (10 * (digits - 1)):
return -1 # error condition
return id DIV int(10 ^ (floor(log(id)-(digits-1))))