그래서 내 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이 존재하지 않으므로 오류가 발생합니다.