복붙노트

[SQL] 오라클에서 대소 문자를 구분 검색

SQL

오라클에서 대소 문자를 구분 검색

LIKE 다른 비교 연산자의 기본 동작은, = 등은 대소 문자를 구분합니다.

그것을 가능하게 그들을 대소 문자를 구별인가?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.어쩌면 당신은 사용해 볼 수 있습니다

    어쩌면 당신은 사용해 볼 수 있습니다

    SELECT user_name
    FROM user_master
    WHERE upper(user_name) LIKE '%ME%'
    
  4. ==============================

    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. ==============================

    5.

    select user_name
    from my_table
    where nlssort(user_name, 'NLS_SORT = Latin_CI') = nlssort('%AbC%', 'NLS_SORT = Latin_CI')
    
  6. ==============================

    6.당신은 그런 일을 할 수 있습니다 :

    당신은 그런 일을 할 수 있습니다 :

    where regexp_like(name, 'string$', 'i');
    
  7. from https://stackoverflow.com/questions/5391069/case-insensitive-searching-in-oracle by cc-by-sa and MIT license