2012-06-14 59 views
1

說,有兩個表。一個包含長文本值的字段(例如foobarbaz),另一個包含較短的值(foobarsomeothertext)。我想從兩個表中檢索具有以下條件的值:文本不能相等,但長字符串的開頭必須與短字符串匹配。 Postgres有沒有一種(整潔的)方式來做到這一點?提前致謝。比較PostgreSQL中的文本值

回答

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

+0

謝謝,這正是我需要的。 '1'是這裏的第一個字符嗎? –

+0

是的,1是第一場比賽的指數。如果不匹配,position()將返回0。 – dslh

+0

難道你不知道是否有辦法用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 || '%'); 
+0

如果最初閱讀這些選項,您是否認爲其他答案代碼的含義更明顯? –

+0

如果您需要稍後擴展邏輯,則正則表達式具有優勢。另外,如果長字符串很長,則第一個解決方案會出現性能問題,因爲它必須通過完整的長字符串來搜索短字符串。 – tobixen

+0

開始思考,如果表格很大,你將會遇到兩種解決方案的性能問題。這可能是你可以通過使用LIKE來利用索引,但我不能100%確定這一點。 – tobixen