Как мне найти диапазон целых чисел в PostgreSQL? - PullRequest
1 голос
/ 08 февраля 2011

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

. В MySQL я бы использовал SELECT ... WHERE id LIKE '19% '

ERROR:  operator does not exist: integer ~~ unknown
LINE 1: select * from "table" where "id" like '19%'

Ответы [ 2 ]

8 голосов
/ 08 февраля 2011

В Postgres LIKE только сравнение строк - это объясняет ошибку.

Вы можете явно преобразовать столбец в строку:

select * from "table" where id::text like '19%'
3 голосов
/ 08 февраля 2011

Для всех натуральных чисел> = 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);

Расчетв основном работает так:

  1. Найдите наибольшую степень 10, которая меньше заданного идентификатора (назовем это X).
  2. Уменьшите величину X на единицу (так как мынужно две цифры)
  3. Поднимите 10 до степени X и приведите к результату тип INTEGER (чтобы последний шаг был SQL DIV вместо деления с плавающей запятой).
  4. 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))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...