2012-06-14 3 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가 이스케이프 처리되어야합니다.

(후 편집) - 이것은 (안 테스트) 등을 사용하는 경우처럼 보일 것입니다 방법입니다

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

처음에이 옵션을 읽는다면 다른 대답의 코드의 의미가 더 분명하다고 생각하지 않습니까? –

+0

논리를 나중에 확장해야하는 경우 regexp에 이점이 있습니다. 또한 긴 문자열이 매우 길면 짧은 문자열을 검색하기 위해 전체 긴 문자열을 거쳐야하므로 첫 번째 솔루션에서 성능 문제가 발생할 수 있습니다. – tobixen

+0

생각해 보면, 테이블이 클 경우 두 솔루션의 성능 문제가 발생할 것입니다. LIKE를 사용하여 인덱스를 악용 할 수 있지만 100 % 확신 할 수는 없습니다. – tobixen