【问题标题】:Compare text values in PostgreSQL比较 PostgreSQL 中的文本值
【发布时间】:2012-06-17 09:31:47
【问题描述】:

比如说,有两张桌子。一个包含具有长文本值的字段(例如foobarbaz),另一个包含较短的值(foobarsomeothertext)。我想从具有以下条件的两个表中检索值:文本不能相等,但长字符串的开头必须与短字符串匹配。在 Postgres 中是否有一种(简洁的)方法可以做到这一点?提前致谢。

【问题讨论】:

    标签: postgresql select conditional-statements


    【解决方案1】:

    怎么样:

    SELECT <whatever>
      FROM <your tables>
     WHERE one_field <> the_other_field
       AND position(the_other_field in one_field) = 1;
    

    string functions and operators

    【讨论】:

    • 谢谢,这正是我所需要的。 1是这里的第一个字符吗?
    • 是的,1 是第一个匹配的索引。如果没有匹配,position() 将返回 0。
    • 你不知道有没有办法用 LIKE 做到这一点?我不确定,因为我之前在 LIKE 中只看到过硬编码模式。
    • LIKE 可以用,是的...它和我下面的解决方案几乎相同,只需将 '~' 替换为 'LIKE' 并在末尾连接一个 '%' 而不是 ' ^' 开始。 LIKE 有一个优点,它可以利用索引……但三思而后行,这可能仅适用于硬编码字符串。
    【解决方案2】:

    正如另一个答案所说,可以使用“位置”......但我会使用正则表达式。

    postgres=> create database test;
    CREATE DATABASE
    postgres=> \c test
    You are now connected to database "test".
    test=> create table long (long varchar);
    CREATE TABLE
    test=> create table short (short varchar);
    CREATE TABLE
    test=> insert into long values ('foobarbaz');
    INSERT 0 1
    test=> insert into long values ('qfoobarbaz');
    INSERT 0 1
    test=> insert into long values ('now this is a long text');
    INSERT 0 1
    test=> insert into short values ('foobar');
    INSERT 0 1
    test=> insert into short values ('someothertext');
    INSERT 0 1
    test=> select long.long from long join short on long.long <> short.short and long.long ~ ('^' || short.short);
       long    
    -----------
     foobarbaz
    (1 row)
    

    警告,short 可能必须转义,以防它包含正则表达式内容。

    (后期编辑) - 这是使用 LIKE 时的样子(未测试):

    select long.long 
    from long 
    join short on 
        long.long <> short.short and 
        long.long LIKE (short.short || '%');
    

    【讨论】:

    • 如果一开始阅读这些选项,您不认为其他答案的代码的含义更明显吗?
    • 如果您以后需要扩展逻辑,正则表达式有好处。此外,如果长字符串很长,第一个解决方案会出现性能问题,因为它必须通过完整的长字符串来搜索短字符串。
    • 想一想,如果表很大,这两种解决方案都会出现性能问题。您可能可以通过使用 LIKE 来利用索引,但我对此不是 100% 确定。
    猜你喜欢
    • 2015-01-08
    • 2016-01-10
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多