[sql] 문자열에 포함 된 경우 Postgresql SELECT

그래서 내 Postgresql에 있습니다.

TAG_TABLE
==========================
id            tag_name
--------------------------
1             aaa
2             bbb
3             ccc

내 문제를 단순화하기 위해 문자열 “aaaaaaaa”에 ‘tag_name’이 포함 된 경우 TAG_TABLE에서 SELECT ‘id’를 선택합니다. 따라서 이상적으로는 태그 이름 ‘aaa’의 ID 인 “1”만 반환해야합니다.

이것이 내가 지금까지하고있는 일입니다.

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaaaaa' LIKE '%tag_name%'

그러나 postgres는 ‘% tag_name %’이 해당 열 아래의 실제 데이터 값 대신 하위 문자열 ‘tag_name’을 포함하는 패턴을 의미한다고 생각하기 때문에 이것은 작동하지 않습니다.

tag_name을 패턴에 어떻게 전달합니까 ??



답변

따옴표 밖에 ‘tag_name’을 사용해야합니다. 그런 다음 레코드 필드로 해석됩니다. ‘||’를 사용하여 연결 문자 그대로 퍼센트 기호로 :

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || tag_name || '%';


답변

개인적으로 ~ 연산자의 더 간단한 구문을 선호합니다.

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name;

차이점 을 이해하기 위해 Postgres에서 LIKE와 ~의 차이점을 읽을 가치 가 있습니다. `


답변

문자열을 검색하기위한 적절한 방법은 사용하는 것입니다 position대신 기능을 like탈출해야합니다 표현 %, _그리고 (이스케이프 문자 \기본값) :

SELECT id FROM TAG_TABLE WHERE position(tag_name in 'aaaaaaaaaaa')>0;


답변

용액과 더불어 'aaaaaaaa' LIKE '%' || tag_name || '%'있다 position(인수의 역순)와 strpos.

SELECT id FROM TAG_TABLE WHERE strpos('aaaaaaaa', tag_name) > 0

더 효율적인 것 외에도 (LIKE가 덜 효율적으로 보이지만 인덱스가 상황을 변경할 수 있음) LIKE에는 매우 사소한 문제가 있습니다. 물론 tag_name 에는 오탐을 제공하지 않기 위해 %특히 _(단일 문자 와일드 카드) 포함해서는 안됩니다 .


답변

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || "tag_name" || '%';

tag_name 따옴표 안에 있어야합니다. 그렇지 않으면 tag_name이 존재하지 않으므로 오류가 발생합니다.


답변