[SQL] 오라클에서 대소 문자를 구분 검색
SQL오라클에서 대소 문자를 구분 검색
LIKE 다른 비교 연산자의 기본 동작은, = 등은 대소 문자를 구분합니다.
그것을 가능하게 그들을 대소 문자를 구별인가?
해결법
-
==============================
1.10gR2의 이후, 오라클은 NLS_COMP 및 NLS_SORT 세션 매개 변수를 설정하여 미세 조정에 문자열 비교의 동작을 할 수 있습니다 :
10gR2의 이후, 오라클은 NLS_COMP 및 NLS_SORT 세션 매개 변수를 설정하여 미세 조정에 문자열 비교의 동작을 할 수 있습니다 :
SQL> SET HEADING OFF SQL> SELECT * 2 FROM NLS_SESSION_PARAMETERS 3 WHERE PARAMETER IN ('NLS_COMP', 'NLS_SORT'); NLS_SORT BINARY NLS_COMP BINARY SQL> SQL> SELECT CASE WHEN 'abc'='ABC' THEN 1 ELSE 0 END AS GOT_MATCH 2 FROM DUAL; 0 SQL> SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC; Session altered. SQL> ALTER SESSION SET NLS_SORT=BINARY_CI; Session altered. SQL> SQL> SELECT * 2 FROM NLS_SESSION_PARAMETERS 3 WHERE PARAMETER IN ('NLS_COMP', 'NLS_SORT'); NLS_SORT BINARY_CI NLS_COMP LINGUISTIC SQL> SQL> SELECT CASE WHEN 'abc'='ABC' THEN 1 ELSE 0 END AS GOT_MATCH 2 FROM DUAL; 1
또한 인덱스 대소 문자를 구분하지를 만들 수 있습니다 :
create index nlsci1_gen_person on MY_PERSON (NLSSORT (PERSON_LAST_NAME, 'NLS_SORT=BINARY_CI') ) ;
이 정보는 오라클 대소 문자 구분 검색에서 가져온 것입니다. 이 기사는 REGEXP_LIKE를 언급하지만, 그것은뿐만 아니라 좋은 오래된 =으로 작동하는 것 같다.
10gR2의 이전의 버전에서는 정말 수행하고 일반적인 접근 방식, 당신이 악센트를 구분 검색을 필요로하지 않는 경우, 단지 UPPER () 열 및 검색 식 모두에있다 할 수 없습니다.
-
==============================
2.전체 텍스트 인덱스를 사용하지 않고 오라클에서 대소 문자를 구분 검색을 수행 할 수있는 3 개 가지 방법이 있습니다.
전체 텍스트 인덱스를 사용하지 않고 오라클에서 대소 문자를 구분 검색을 수행 할 수있는 3 개 가지 방법이 있습니다.
궁극적으로 어떤 방법을 선택하는 것은 개인의 상황에 따라 달라집니다; 기억해야 할 중요한 것은 당신이 대소 문자를 구분 검색을위한 제대로 인덱스해야 성능을 향상시킬 수 있다는 점이다.
당신은 UPPER () 또는 LOWER ()를 사용하여 동일한 경우로 모든 데이터를 강제 할 수 있습니다 :
select * from my_table where upper(column_1) = upper('my_string');
또는
select * from my_table where lower(column_1) = lower('my_string');
column_1는 상부 (column_1) 이하 (column_1)에 인덱싱되어 있지 않으면 적절하게,이 풀 테이블 스캔을 강제 할 수있다. 이를 방지하기 위해 당신은 함수 기반 인덱스를 생성 할 수 있습니다.
create index my_index on my_table ( lower(column_1) );
당신이 LIKE를 사용하는 경우에 당신은 당신이 검색하는 문자열 주위 %을 연결해야합니다.
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
이 SQL 바이올린이 모든 쿼리에서 일어나는 보여줍니다. (가)이없는 경우 인덱스를 사용할 때 표시하고 계획을 설명합니다.
오라클 10g 이후 REGEXP_LIKE에서 () 사용할 수 있습니다. 당신은 대소 문자를 구분 검색을 수행하기 위해, _match_parameter_ '난'을 지정할 수 있습니다.
순서는 항등 연산자로 사용하기 위해 당신은 캐럿과 달러 기호로 표시되는 문자열의 시작과 끝을 지정해야합니다.
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
LIKE의 등가를 수행하기 위해, 이들은 제거 될 수있다.
select * from my_table where regexp_like(column_1, 'my_string', 'i');
당신의 문자열이 정규 표현식 엔진에 의해 다르게 해석됩니다 문자를 포함 할 수 있으므로이주의하십시오.
이 SQL 바이올린는 REGEXP_LIKE를 사용하는 것을 제외하고 당신에게 같은 예제 출력을 보여줍니다 ().
NLS_SORT 매개 변수는 = 및 LIKE를 포함하여 주문에 대한 정렬 순서와 다양한 비교 연산자를 제어합니다. 당신은 종류의 세션을 변경하여, 이진, 대소 문자 구분을 지정할 수 있습니다. 이것은 모든 쿼리는 대소 문자를 구분 매개 변수를 수행 세션에서 수행한다는 것을 의미합니다.
alter session set nls_sort=BINARY_CI
다른 언어를 지정하려면, 또는 BINARY_AI를 사용하여 악센트를 구분 검색을 수행 할 경우 언어 적 정렬 및 문자열 검색 주위에 추가 정보가 많이있다.
당신은 또한 NLS_COMP 매개 변수를 변경해야합니다; 인용하기 :
NLS_COMP의 기본값은 BINARY입니다; 오라클은 NLS_SORT의 가치에 주목해야한다고하지만, 언어 지정 :
그래서, 다시 한번, 당신은 세션을 변경해야
alter session set nls_comp=LINGUISTIC
문서에서 언급 한 바와 같이하여 성능을 향상시킬 수있는 언어 인덱스를 만들 수 있습니다
create index my_linguistc_index on my_table (NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));
-
==============================
3.어쩌면 당신은 사용해 볼 수 있습니다
어쩌면 당신은 사용해 볼 수 있습니다
SELECT user_name FROM user_master WHERE upper(user_name) LIKE '%ME%'
-
==============================
4.오라클 12C R2에서 당신은 COLLATE 연산자를 사용할 수 있습니다 :
오라클 12C R2에서 당신은 COLLATE 연산자를 사용할 수 있습니다 :
데모:
CREATE TABLE tab1(i INT PRIMARY KEY, name VARCHAR2(100)); INSERT INTO tab1(i, name) VALUES (1, 'John'); INSERT INTO tab1(i, name) VALUES (2, 'Joe'); INSERT INTO tab1(i, name) VALUES (3, 'Billy'); --========================================================================-- SELECT /*csv*/ * FROM tab1 WHERE name = 'jOHN' ; -- no rows selected SELECT /*csv*/ * FROM tab1 WHERE name COLLATE BINARY_CI = 'jOHN' ; /* "I","NAME" 1,"John" */ SELECT /*csv*/ * FROM tab1 WHERE name LIKE 'j%'; -- no rows selected SELECT /*csv*/ * FROM tab1 WHERE name COLLATE BINARY_CI LIKE 'j%'; /* "I","NAME" 1,"John" 2,"Joe" */
DB <> 바이올린 데모
-
==============================
5.
select user_name from my_table where nlssort(user_name, 'NLS_SORT = Latin_CI') = nlssort('%AbC%', 'NLS_SORT = Latin_CI')
-
==============================
6.당신은 그런 일을 할 수 있습니다 :
당신은 그런 일을 할 수 있습니다 :
where regexp_like(name, 'string$', 'i');
from https://stackoverflow.com/questions/5391069/case-insensitive-searching-in-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] T-SQL과 함께 일 월 및 연도에서 날짜를 만들기 (0) | 2020.03.16 |
---|---|
[SQL] 어떻게 ID 값을 얻기 위해 INSERT 문 OUTPUT 절을 사용합니까? (0) | 2020.03.16 |
[SQL] C # .NET을 사용하여 .SQL 스크립트 파일을 실행하는 방법 (0) | 2020.03.16 |
[SQL] MySQL의 테이블 열 이름을 얻기? (0) | 2020.03.16 |
[SQL] 어떻게 무작위 SQL에서 행을 선택하려면? (0) | 2020.03.16 |