programing

Postgresql에서 "대소문자를 구분하지 않는" 쿼리를 만드는 방법은 무엇입니까?

bestprogram 2023. 6. 26. 21:31

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')

용사를 ILIKELIKE

SELECT id FROM groups WHERE name ILIKE 'Administrator'

가장 일반적인 방법은 검색 문자열과 데이터를 소문자 또는 대문자로 만드는 것입니다.하지만 거기에는 두 가지 문제가 있습니다.

  1. 그것은 영어로 작동하지만, 모든 언어로 작동하는 것은 아닙니다.(아마도 대부분의 언어에서는 그렇지 않을 것입니다.)모든 소문자에 해당하는 대문자가 있는 것은 아닙니다. 모든 소문자에 해당하는 소문자가 있는 것은 아닙니다.
  2. lower() 및 upper()와 같은 기능을 사용하면 순차적으로 스캔할 수 있습니다.인덱스를 사용할 수 없습니다.내 테스트 시스템에서 lower()를 사용하면 인덱스를 사용할 수 있는 쿼리보다 약 2000배 더 오래 걸립니다. (테스트 데이터의 행 수가 100k를 조금 넘습니다.)

더 효과적일 수 있는 덜 자주 사용되는 솔루션이 적어도 세 가지 있습니다.

  1. 대부분 대소문자를 구분하지 않는 데이터 유형의 동작을 모방하는 citext 모듈을 사용합니다.해당 모듈을 로드한 후 다음을 통해 대소문자를 구분하지 않는 인덱스를 만들 수 있습니다.CREATE INDEX ON groups (name::citext);(그러나 아래를 참조하십시오.)
  2. 대소문자를 구분하지 않는 조합을 사용합니다.데이터베이스를 초기화할 때 설정됩니다.대/소문자를 구분하지 않는 데이터 정렬을 사용하면 클라이언트 코드에서 거의 모든 형식을 사용할 수 있으며 유용한 결과를 반환할 수 있습니다. 즉, 대/소문자를 구분하는 쿼리를 수행할 수 없습니다.헉.)
  3. 기능 인덱스를 만듭니다.다을사용소인만들기덱스문을 사용하여 색인을 .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