如何在PostgreSQL中搜索一系列整数?

时间:2011-02-08 06:51:15

标签: postgresql search integer

我有一个整数列,我需要搜索所述列以19

开头的行

在MySQL中我会使用SELECT ... WHERE id LIKE '19%'

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

2 个答案:

答案 0 :(得分:8)

在Postgres中LIKE只是字符串比较 - 这解释了错误。

您可以显式地将列转换为字符串:

select * from "table" where id::text like '19%'

答案 1 :(得分:3)

对于所有正整数> = 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. 找出小于给定ID的最大10的幂(让我们称之为X)。
  2. 将X的幅度减一(因为我们需要两位数)
  3. 将10提升到X的幂并将结果转换为INTEGER类型(强制最后一步为SQL DIV而不是浮点除法)。
  4. 将原始ID乘以10 ^ x得到前两位数字。
  5. 这个算法甚至可以推广到函数f(x,y),其中x是id,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))))