6

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

4

2 回答 2

3

怎么样:

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

请参阅字符串函数和运算符

于 2012-06-14T11:11:19.420 回答
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 || '%');
于 2012-06-14T11:13:58.507 回答