2011-02-08 45 views
1

我有一个整数列,我需要寻找其中所述塔19如何在PostgreSQL中搜索整数范围?

在MySQL中我会使用SELECT ...开始行,其中id LIKE '19%”

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

回答

8

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

可以明确转换列到字符串,但:

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

我会建议`其中CAST(id AS文本)像'19%'`但'id :: text`更好。 – 2011-02-08 07:05:23

3

对于所有正整数> = 10,你可以用任何文本/ 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(我们称之为X)的10的最大幂。
  2. 将X的大小降低一(因为我们需要两位数)
  3. 将X提高10并将结果强制转换为INTEGER类型(强制最后一步是SQL DIV而不是浮点数师)。
  4. DIV原始ID由10^x得到前两位数字。

该算法甚至可以概括为一个函数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))))