PostgreSQL에서 대소 문자를 구분하지 않는 쿼리를 작성하는 방법이 있습니까? 예를 들어 다음 3 개의 쿼리가 동일한 결과를 반환하기를 원합니다.
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
PostgreSQL에서 대소 문자를 구분하지 않는 쿼리를 작성하는 방법이 있습니까? 예를 들어 다음 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')
varchar_pattern_ops
인덱스가 LIKE 'xxx%'
쿼리 와 함께 작동하도록할지 지정 하십시오 ( 예 :) CREATE INDEX ix_groups_name ON groups (lower(name) varchar_pattern_ops)
.
ILIKE
, 그것은 작동합니다 but with slow response
. 계산 결과를 기반으로 테이블에 빠르게 액세스하려면 이것을 확인하는 사람은 받아 들일 수있는 대답을 따라야한다고 제안합니다. 자세한 내용은 여기 와 여기를
사용하는 ILIKE
대신LIKE
SELECT id FROM groups WHERE name ILIKE 'Administrator'
ILIKE
봄 부팅에 사용할 때 최대 절전 모드를 지원하지 않습니다.
org.hibernate.dialect.PostgreSQL94Dialect
와 Spring Boot 2.0.6.RELEASE 와 함께 작동합니다 . 그러나 IntelliJ는 그것에 대해 불평합니다.
가장 일반적인 방법은 검색 문자열과 데이터를 소문자 또는 대문자로 만드는 것입니다. 그러나 두 가지 문제가 있습니다.
더 효과적 일 수있는 자주 사용되지 않는 솔루션이 3 개 이상 있습니다.
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 모듈은 대소 문자를 구분하지 않는 데이터 형식을 제공하지 않습니다. 대신 각 문자열이 소문자처럼 작동합니다. 즉, lower()
위의 3 번과 같이 각 문자열에서 호출 한 것처럼 작동합니다. 프로그래머가 문자열을 소문자로 기억할 필요가 없다는 장점이 있습니다. 그러나 citext를 사용하기 전에 문서에서 "문자열 비교 동작"및 "제한 사항"섹션을 읽어야합니다.
col = 'a'
하고 col = 'b'
). # 2에 대하여 : 당신이 말했듯이, 당신은 표현식에 대한 인덱스를 만들 수 있으므로 실제로 문제가되지 않습니다. 그러나 데이터 정렬을 변경하는 것이 가장 좋은 해결책이라는 데 동의합니다.
select * from pg_collation;
.
당신이 사용할 수있는 ILIKE
. 즉
SELECT id FROM groups where name ILIKE 'administrator'
lower
함수 를 사용하는 것이 좋습니다 . 더보기 세부
ILIKE
키워드를 읽을 수도 있습니다 . SQL 표준을 준수하지 않더라도 때때로 매우 유용 할 수 있습니다. 자세한 내용은 여기를 참조하십시오 : http://www.postgresql.org/docs/9.2/static/functions-matching.html
email ILIKE 'user-input-email-here'
사용자 입력을 피하십시오. 그렇지 않으면 사람들은 %와 같은 문자를 입력 할 수 있습니다.
ILIKE
하고 prepared statements
이 나를 보호 할 것입니다 sql injection
?
lower(column_name) like %expression%
.
POSIX 정규식을 사용할 수도 있습니다.
SELECT id FROM groups where name ~* 'administrator'
SELECT 'asd' ~* 'AsD'
보고 t