【问题标题】:How do I search for a range of integers in PostgreSQL?如何在 PostgreSQL 中搜索整数范围?
【发布时间】:2011-02-08 06:51:15
【问题描述】:

我有一个整数列,我需要搜索该列以 19 开头的行

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

错误:运算符不存在:整数~~未知
LINE 1: select * from "table" where "id" like '19%'

【问题讨论】:

    标签: postgresql search integer


    【解决方案1】:

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

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

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

    【讨论】:

    • 我会提议 where CAST (id AS text) like '19%'id::text 更好。
    • 然而,CAST (id AS xxx) 是标准的 SQL 强制转换语法。
    【解决方案2】:

    对于所有 >= 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(我们称之为 X)的 10 的最大幂。
    2. 将 X 的大小减一(因为我们需要两位数)
    3. 将 10 提高到 X 的幂并将结果强制转换为 INTEGER 类型(强制最后一步为 SQL DIV 而不是浮点除法)。
    4. 将原始 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))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      相关资源
      最近更新 更多