IT HOW

무엇이는 물어보세요

컨텐츠로 건너뛰기
  • 프로그래밍
  • 파이썬
  • 자바
  • 자바스크립트
  • 리눅스
  • c#

Oracle에서 대소 문자를 구분하지 않는 검색 동작 LIKE및 기타

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

대소 문자를 구분하지 않습니까?



답변

10gR2부터 Oracle은 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')
   )
;

이 정보는 대소 문자를 구분하지 않는 Oracle 검색 에서 가져온 것입니다 . 이 기사는 언급 REGEXP_LIKE하지만 좋은 오래된 =것으로도 작동하는 것 같습니다 .


10gR2 이전의 버전에서는 실제로 수행 할 수 없으며 악센트에 구애받지 않는 검색이 필요하지 않은 경우 일반적인 접근 방식 UPPER()은 열과 검색 표현식 모두입니다.


답변

전체 텍스트 인덱스를 사용하지 않고 Oracle에서 대소 문자를 구분하지 않는 검색을 수행하는 3 가지 주요 방법이 있습니다.

궁극적으로 어떤 방법을 선택 하느냐는 개인의 상황에 따라 다릅니다. 기억해야 할 것은 성능을 향상 시키려면 대소 문자를 구분하지 않는 검색을 위해 올바르게 색인을 작성해야한다는 것입니다.

1. 열과 문자열을 동일하게 입력하십시오.

당신은 사용하여 동일한 경우로 모든 데이터를 강제로 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인덱스가없는 경우 전체 테이블 스캔을 수행 할 수 있습니다. 이를 피하기 위해 함수 기반 색인을 작성할 수 있습니다 .upper(column_1)lower(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 Fiddle 은 이러한 모든 쿼리에서 발생하는 상황을 보여줍니다. 설명 계획은 인덱스가 사용되는시기와 사용되지 않는시기를 나타냅니다.

2. 정규식을 사용하십시오.

Oracle 10g부터 REGEXP_LIKE()사용할 수 있습니다. 'i'대소 문자를 구분하지 않는 검색을 수행하기 위해 _match_parameter_를 지정할 수 있습니다 .

이것을 항등 연산자로 사용하려면 문자열의 시작과 끝을 지정해야하며 캐럿과 달러 기호로 표시됩니다.

select * from my_table where regexp_like(column_1, '^my_string$', 'i');

LIKE와 동등한 기능을 수행하기 위해 LIKE를 제거 할 수 있습니다.

select * from my_table where regexp_like(column_1, 'my_string', 'i');

문자열에 정규식 엔진에서 다르게 해석되는 문자가 포함될 수 있으므로주의하십시오.

이 SQL Fiddle 은 REGEXP_LIKE ()를 사용하는 것을 제외하고 동일한 출력 예를 보여줍니다.

3. 세션 레벨에서 변경하십시오.

NLS_SORT의 매개 변수는 주문 및 다양한 비교 연산자를 포함에 대한 정렬 순서 지배 =와 LIKE를. 세션을 변경하여 대소 문자를 구분하지 않는 이진 정렬을 지정할 수 있습니다. 이는 해당 세션에서 수행 된 모든 쿼리가 대소 문자를 구분하지 않는 매개 변수를 수행함을 의미합니다.

alter session set nls_sort=BINARY_CI

다른 언어를 지정하거나 BINARY_AI를 사용하여 악센트에 구애받지 않는 검색을 수행하려는 경우 언어 정렬 및 문자열 검색에 대한 추가 정보가 많이 있습니다 .

NLS_COMP 매개 변수도 변경해야합니다 . 인용 :

NLS_SORT 매개 변수를 따르는 정확한 연산자 및 쿼리 절은 NLS_COMP 매개 변수의 값에 따라 다릅니다. 연산자 또는 절이 NLS_COMP에 의해 결정된 NLS_SORT 값을 준수하지 않으면 사용 된 데이터 정렬은 BINARY입니다.

NLS_COMP의 기본값은 BINARY입니다. 그러나 LINGUISTIC은 Oracle이 NLS_SORT의 가치에주의를 기울여야한다고 지정합니다.

WHERE 절과 PL / SQL 블록의 모든 SQL 연산을 비교하려면 NLS_SORT 매개 변수에 지정된 언어 정렬을 사용해야합니다. 성능을 향상시키기 위해 언어 비교를 원하는 열에 언어 색인을 정의 할 수도 있습니다.

다시 한 번 세션을 변경해야합니다.

alter session set nls_comp=LINGUISTIC

문서에서 언급했듯이 언어 색인 을 작성하여 성능을 향상시킬 수 있습니다.

create index my_linguistc_index on my_table
   (NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));

답변

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

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

답변

Oracle 12c R2에서 다음을 사용할 수 있습니다 COLLATE operator.

COLLATE 연산자는 표현식의 데이터 정렬을 결정합니다. 이 연산자를 사용하면 표준 데이터 정렬 파생 규칙을 사용하여 데이터베이스가 식에 대해 파생 한 데이터 정렬을 재정의 할 수 있습니다.

COLLATE 연산자는 이름이 지정된 콜 레이션 또는 의사 콜 레이션을 지정할 수있는 collation_name 인수를 사용합니다. 데이터 정렬 이름에 공백이 있으면 이름을 큰 따옴표로 묶어야합니다.

데모:

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 <> 바이올린 데모


답변

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

답변

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

where regexp_like(name, 'string$', 'i');

답변


이 글은 프로그래밍 카테고리에 분류되었고 case-insensitive, case-sensitive, oracle, sql, sql-like 태그가 있으며 [호호] 야야님에 의해 2022년 4월 18일에 작성되었습니다.

글 네비게이션

← IP를 네트워크 접두어로 변경 한 후 라우터와 연결되지 않음 및 라우터 TP-Link Archer C7에 있습니다. 내가 Firefox 57.0 Quantum으로 업데이트 한 후 모든 탭 그룹이 손실 됨 후 모든 탭 그룹이 손실 됨 →

태그

  • android
  • apt
  • backup
  • bash
  • boot
  • c#
  • c++
  • command-line
  • css
  • debian
  • email
  • firefox
  • git
  • google-chrome
  • hard-drive
  • html
  • ios
  • iphone
  • java
  • javascript
  • keyboard
  • linux
  • mac
  • macbook
  • macos
  • microsoft-excel
  • mysql
  • networking
  • performance
  • php
  • python
  • security
  • shell
  • ssh
  • terminal
  • ubuntu
  • unix
  • usb
  • vim
  • virtualbox
  • windows
  • windows-7
  • windows-8
  • windows-10
  • wireless-networking

최신 글

  • 디스크 정리에 많은 시간과 CPU가 필요한 이유는 무엇입니까? 많은 시간을 소비하는 것 같습니다. 파일을
  • Vim에서 일반 모드와 삽입 모드 사이에서 커서를 어떻게 변경합니까? 모양 등)를 변경하는 방법을 알고
  • 집계 대 구성 무엇인지 이해하지만 집계가 무엇인지에 대한 명확한
  • Python 생성기 패턴에 해당하는 C ++
  • 소프트웨어 일반인의 경력 경로는 무엇입니까? [닫은] 전문에 대한 질문 이 질문에 영감을. 소프트웨어 전문가가

카테고리

  • c#
  • c++
  • git
  • html
  • 리눅스
  • 서버
  • 소프트웨어
  • 슈퍼유저
  • 안드로이드
  • 애플
  • 우분투
  • 자바
  • 자바스크립트
  • 파이썬
  • 프로그래밍
apthow.com powered by hoya
Exit mobile version