代码之家  ›  专栏  ›  技术社区  ›  slevin

PostgreSQL查询中部分匹配整数

  •  0
  • slevin  · 技术社区  · 6 年前

    integer . 此列表示产品代码,应根据其他代码或代码的一部分对其进行搜索。该列的值由三个部分组成,一个五位数部分和两个两位数部分。用户只能搜索第一部分、第一第二部分或第一第二第三部分。

    所以,在我的专栏里 123451233 用户搜索 12345 (第一部分)。我想能把 123451233 1234512 123451233

    不幸的是,我不能更改列的类型,也不能将一个列分成三个(每个部分一个)。我该怎么做?我不能用 LIKE . 也许是整数的正则表达式?

    3 回复  |  直到 6 年前
        1
  •  1
  •   klin    6 年前

    您不需要regex函数。将整数转换为 text left() ,示例:

    create table my_table(code int); -- or bigint
    insert into my_table values (123451233);
    
    with input_data(input_code) as (
        values('1234512')
    )
    
    select t.*
    from my_table t
    cross join input_data
    where left(code::text, length(input_code)) = input_code;
    
       code    
    -----------
     123451233
    (1 row) 
    
        2
  •  1
  •   Tom    6 年前
    \b(123)[0-9]+\b
    

    你只要把搜索词放在括号里就行了

    例子: regexr.com/3u6ii

    所以 \b(123)[0-9]+\b 将匹配整个:

     -> 1234567
        1245621
        193602
    

    但是 \b(12)[0-9]+\b 将匹配第一个和第二个

        3
  •  1
  •   Abelisto    6 年前

    考虑使用简单的算法。 log(value)::int + 1 返回 value 使用这个:

    value/(10^(log(value)::int-log(search_input)::int))::int
    

    回报 价值 截断为与 search_input 所以,最后

    search_input = value/(10^(log(value)::int-log(search_input)::int))::int
    

    它字面上更复杂,但也可能比字符串操作更有效。

    附言: 但是 像索引一样 create index idx on your_table(cast(your_column as text));

    select * from your_table
    where cast(your_column as text) like search_input || '%';
    

    是国际海事组织的最佳案例。