2011-05-25 115 views
2

给定一个表作为字符串(即“4.6英寸,3毫米”,“长度:4.66英寸”等)的测量,我想检索几乎任何左侧或右侧的行的数字,只要数字匹配。 “6”, “6英寸”, “航空自卫队在6” 等 Postgresql模式匹配字符串列

  • 不匹配:

    换句话说,如果我在寻找 “6”:

    • 比赛: “16”,“6.6”,“与66”等

    我有以下查询迄今:

    select distinct length from items where length ~ '[[:<:]]6[[:>:]]'; 
    

    但它不完全是我要找的,因为这个 是结果:

     length  
    --------------- 
    6.25 Inches 
    4.6666 Inches 
    6.5 Inches 
    1.66 Inches 
    6 Inches 
    6.75 Inches 
    6.71 Inches 
    24.6 Inches 
    3.6666 Inches 
    

    我使用PostgreSQL 9.任何帮助,将不胜感激。谢谢

  • 回答

    0

    如何:

    '^[^0-9]*6[^0-9]*$' 
    
    +0

    不只是我在找什么,谢谢。 – 2011-05-26 13:48:16

    +0

    @Lock雷克:不客气。 – Toto 2011-05-26 13:50:23

    0
    create table foo (length text); 
    insert into foo values ('6 in'), ('asdf 6 in'), ('6in'), ('16 in'), ('6.6 in'), ('6.6'), ('with 66 in'); 
    select distinct length from foo where length ~ '[^0-9 .][0-5.7-9 ]*6|6*[0-5.7-9 ]*[^0-9 .]'; 
    

    编辑为与'6'和'6.6'正确工作。

    1

    据我所知,你想要字符串中的确切数字匹配。所以数字(在你的情况下是6)不能被数字或十进制符号包围。所以正则表达式应该看起来像这样:

    [^0-9\.]6[^0-9\.] 
    

    您可以将6更改为您正在查找的任意数字。

    0

    没有冒犯,但将其存储为varchar不是一个好主意。

    这应该存储为两个单独的字段(数量/单位)或(更好)单个字段(具有预定义单位的数量,例如mm),并相应地进行查询。

    +0

    绝对同意。问题是这种格式的数据来自外部来源,需要进行拆分,因此需要这种模式匹配器。 – 2011-05-26 13:47:12