Postgresql에서 "대소문자를 구분하지 않는" 쿼리를 만드는 방법은 무엇입니까?
Postgre에서 대소문자를 구분하지 않는 쿼리를 작성할 수 있는 방법이 있습니까?SQL, 예를 들어, 나는 아래의 3개의 쿼리가 동일한 결과를 반환하기를 원합니다.
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
비교하기 전에 문자열을 소문자로 변환하려면 LOWER 함수를 사용합니다.
사용해 보십시오.
SELECT id
FROM groups
WHERE LOWER(name)=LOWER('Administrator')
용사를 ILIKE
에 LIKE
SELECT id FROM groups WHERE name ILIKE 'Administrator'
가장 일반적인 방법은 검색 문자열과 데이터를 소문자 또는 대문자로 만드는 것입니다.하지만 거기에는 두 가지 문제가 있습니다.
- 그것은 영어로 작동하지만, 모든 언어로 작동하는 것은 아닙니다.(아마도 대부분의 언어에서는 그렇지 않을 것입니다.)모든 소문자에 해당하는 대문자가 있는 것은 아닙니다. 모든 소문자에 해당하는 소문자가 있는 것은 아닙니다.
- lower() 및 upper()와 같은 기능을 사용하면 순차적으로 스캔할 수 있습니다.인덱스를 사용할 수 없습니다.내 테스트 시스템에서 lower()를 사용하면 인덱스를 사용할 수 있는 쿼리보다 약 2000배 더 오래 걸립니다. (테스트 데이터의 행 수가 100k를 조금 넘습니다.)
더 효과적일 수 있는 덜 자주 사용되는 솔루션이 적어도 세 가지 있습니다.
- 대부분 대소문자를 구분하지 않는 데이터 유형의 동작을 모방하는 citext 모듈을 사용합니다.해당 모듈을 로드한 후 다음을 통해 대소문자를 구분하지 않는 인덱스를 만들 수 있습니다.
CREATE INDEX ON groups (name::citext);
(그러나 아래를 참조하십시오.) - 대소문자를 구분하지 않는 조합을 사용합니다.데이터베이스를 초기화할 때 설정됩니다.대/소문자를 구분하지 않는 데이터 정렬을 사용하면 클라이언트 코드에서 거의 모든 형식을 사용할 수 있으며 유용한 결과를 반환할 수 있습니다. 즉, 대/소문자를 구분하는 쿼리를 수행할 수 없습니다.헉.)
- 기능 인덱스를 만듭니다.다을사용소인만들기덱스문을 사용하여 색인을 .
CREATE INDEX ON groups (LOWER(name));
, 은 이게하다같은쿼사리인수있활다습과 같은 쿼리로 할 수 .SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
또는SELECT id FROM groups WHERE LOWER(name) = 'administrator';
LOWER()를 사용하는 것을 기억해야 합니다.
하지 않는 데이터 . citext 모듈 대소문를지않않다습니지제공하을유형터이데는하분이구자제실▁the▁doesn다▁type▁cite니.대신 각 문자열이 소문자인 것처럼 동작합니다.즉, 당신이 전화를 한 것처럼 행동합니다.lower()
위의 3번과 같이 각 문자열에서.장점은 프로그래머가 소문자 문자열을 기억할 필요가 없다는 것입니다.그러나 citext를 사용하기 전에 문서에서 "문자열 비교 동작" 및 "제한" 섹션을 읽어야 합니다.
사용할 수 있습니다.ILIKE
를 들어 예를 들어.
SELECT id FROM groups where name ILIKE 'administrator'
당신은 또한 다음을 읽을 수 있습니다.ILIKE
키워드SQL 표준을 준수하지 않더라도 때때로 매우 유용할 수 있습니다.자세한 내용은 여기를 참조하십시오. http://www.postgresql.org/docs/9.2/static/functions-matching.html
다음과 같은 POSIX 정규 표현을 사용할 수도 있습니다.
SELECT id FROM groups where name ~* 'administrator'
SELECT 'asd' ~* 'AsD'
돌아온다t
사용하다ILIKE
select id from groups where name ILIKE 'adminstration';
만약 당신이 오는 expressjs 배경과 이름이 변수 사용이라면.
select id from groups where name ILIKE $1;
사용.~*
INSTR의 기능을 통해 성능을 크게 향상시킬 수 있습니다.
SELECT id FROM groups WHERE name ~* 'adm'
OR이 'adm'에 해당하는 이름의 행을 반환합니다.
저는 이런 경우에 일을 좋아합니다.
SELECT id
FROM groups
WHERE name ILIKE 'Administrator'
대소문자를 구분하지 않는 매개 변수화된 쿼리의 경우 다음 구문을 사용할 수 있습니다.
"select * from article where upper(content) LIKE upper('%' || $1 || '%')"
-- Install 'Case Ignore Test Extension'
create extension citext;
-- Make a request
select 'Thomas'::citext in ('thomas', 'tiago');
select name from users where name::citext in ('thomas', 'tiago');
대/소문자뿐만 아니라 분음 부호도 원하는 경우 자체 함수를 구현할 수 있습니다.
CREATE EXTENSION unaccent;
CREATE OR REPLACE FUNCTION lower_unaccent(input text)
RETURNS text
LANGUAGE plpgsql
AS $function$
BEGIN
return lower(unaccent(input));
END;
$function$;
통화는 다음과 같습니다.
select lower_unaccent('Hôtel')
>> 'hotel'
테스트된 접근 방식은~*
아래의 예와 같이
SELECT id FROM groups WHERE name ~* 'administrator'
select id from groups where name in ('administrator', 'ADMINISTRATOR', 'Administrator')
언급URL : https://stackoverflow.com/questions/7005302/how-to-make-case-insensitive-query-in-postgresql
'programing' 카테고리의 다른 글
워크북을 전역 변수로 선언 (0) | 2023.06.26 |
---|---|
UI이미지를 NSData로 변환 (0) | 2023.06.26 |
문자열의 악센트를 제거하려면 어떻게 해야 합니까? (0) | 2023.06.26 |
C# MongoDB: 도메인 개체를 올바르게 매핑하는 방법은 무엇입니까? (0) | 2023.06.26 |
Excel VBA의 전역 변수를 워크북에 표시하도록 선언하는 방법 (0) | 2023.06.26 |