2015-02-06 3 views
3

스크립트를 통해 연속적으로 발생하는 많은 쿼리 집합에서 단일 쿼리는 REGEXP_LIKE를 사용합니다. 그것에서는 정규 표현식 ([a-z])이 발음 구별 부호 (á, õ, ì)와 일치하는 것을 원하지 않습니다. 이 작업을 수행하는 유일한 방법은 NLS_SORT를 BINARY로 설정하는 것입니다. 그러나이 쿼리는 나중에 실행되는 다른 쿼리에 영향을 미치지 않습니다.단일 쿼리에 대한 NLS_SORT 변경

이 이유로,이 쿼리에 대해서만 변수 NLS_SORT를 설정하고 싶습니다. 그러나 PL/SQL을 사용하지 않을 것입니다. 이것을 달성 할 수있는 방법이 있습니까?

나는이 선호하지만, 내가 찾은 문서에 따르면, 이러한 매개 변수가 존재하지 :

SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]'); -- match 
ALTER SESSION SET NLS_SORT = BINARY; 
SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]'); -- no match 
ALTER SESSION SET NLS_SORT = DEFAULT; -- not working 
ALTER SESSION RESET NLS_SORT;   -- not working 
  • 다른 방법이 있나요 :

    SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]', BINARY); 
    

    나는 이런 식으로 뭔가를 상상할 수 NLS_SORT를 설정하는 것보다 정규 표현식에서 발음 구별 부호를 제외시킬 수 있습니까?

  • PL/SQL없이 NLS_SORT 설정을 복원 할 수있는 방법이 있습니까? 다른 정규 표현식에서 그들을 outrule 당신이 할 수 암시 적 일치하지 carachtes 알고있는 경우
+0

쿼리가 실행되기 전에 세션을 변경하고 쿼리를 실행 한 후 매개 변수를 다시 설정할 수 있습니다. https://lalitkumarb.wordpress.com/2014/01/22/oracle-case-insensitive-sorts-compares/ –

+0

지금은 DUTCH이지만이 코드를 하드 코딩하고 싶지는 않습니다. – TacoV

+1

어떤 이유로보고있는 것을 시뮬레이트 할 수 없습니다. 아마도 고려하지 않은 다른 NLS 설정 일 수 있습니다. 내가 á와 일치하는 것을 얻을 수있을 때,'c' 또는'i'를'match_param '의 세번째 인수로'regexp_like'에 넘기는 것은 일치를 멈 춥니 다. 그걸 배제할만한 가치가 있을까요? –

답변

1


그래서, 알렉스 풀 덕분에, 나는 REGEXP_LIKE의 match_paramater 옵션을 재평가. documentation에서 :

match_parameter에이 함수의 기본 일치하는 동작을 변경할 수있는 텍스트 문자입니다. 당신은 match_parameter에에 대해 다음 값 중 하나 이상을 지정할 수 있습니다

  • ...
  • 'c'는 대소 문자를 구별한다. 대소 문자가 일치하는 전자 일치의 전자 A 또는 여부에 영향을 보이지 않을 것이지만
  • ...

, here는 일종의는 대소 문자를 구분하는 경우, 그것은 또한 강조 민감한 있다고 적혀있다 :

Oracle Database 10g부터 Oracle Database는 대소 문자를 구분하지 않고 액센트를 구분하지 않고 언어 정렬 옵션을 제공합니다. 다음 유형의 단일 언어 및 다국어 언어 정렬을 제공합니다.

  • 기본 문자, 분음 부호, 구두점 및 대소 문자에 대한 정보를 사용하는 언어 정렬. 이들은 "언어 정렬 사용"에서 설명하는 표준 단일 언어 및 다국어 언어 정렬입니다.
  • 기본 문자, 분음 부호 및 구두점에 대한 정보는 사용하지만 소문자 및 구두점에 대해서는 정보를 사용하지 않는 다국어 정렬과 기본 문자 및 분음 기호에 대한 정보를 사용하는 다국어 정렬을 사용합니다. 이 유형의 정렬은 대소.자를 구분하지 않습니다.
  • 기본 문자 및 구두점에 대한 정보 만 사용하는 단일 언어 정렬 및 기본 문자에 대한 정보 만 사용하는 다국어 정렬.이 유형의 정렬은 액센트를 구분하지 않습니다. 대/소문자를 구분하지 않는 정렬 인 은 액센트를 구분하지 않는 정렬에서는 대소 문자에 대한 정보 (예 :)를 사용하지 않습니다.

이 모든 악센트를 구분 종류 따라서 암시 적으로 대소 문자를 구분하는 일종의 악센트를 구분해야한다는 대소 문자를 구분하며, 상태.

그래서, 결론 : SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]', 'c');

  • 아니오, 그것을 하나의 쿼리에 대해 NLS_SORT를 변경하고 되돌릴 수있는 방법은 없습니다 모르게 :

    • 은 예, 분음 부호를 제외 할 수있는 더 좋은 방법이있다 또는 초기 값 저장.
  • +1

    동작이 가변적 인 것 같습니다. [this Fiddle] (http://sqlfiddle.com/#!4/d41d8/40437)과 일치하지 않습니다. 내 (영국, 미국) 환경에서 나는 REGEXP_LIKE ('á', '[a-z]');와 일치하는 것을 얻었지만 다른 것은 없다. 따라서 NLS 및/또는 문자 집합은 여전히 ​​효과가있는 것으로 보입니다. 아마도 두 인스턴스의 차이점을 볼 수 있지만 그 이유는 모르겠지만 ... –

    +0

    그러나 모든 경우에 * c 옵션을 사용하면 발음 구별 부호가 일치하지 않습니다. 맞습니까? 'c'는 액센트에 민감한 동작을 강요합니다.'i'는 액센트를 구분하지 않으며 대소 문자를 구분하지 않습니다. 매개 변수를 생략하면 함수가 NLS 설정으로 되돌아갑니다. – TacoV

    +0

    * 안전한 해석 인 것 같습니다. 그렇습니다.하지만 아주 작은 샘플에 있습니다. 문서에서 나는 동의하지만,'i'의 행동은 그것이 무엇을 해야하는지를 이해하는 한, 꽤 일치하지 않습니다. 지나치게 조심스러워 아마 * 8-) –

    1

    음 :

    SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]') AND NOT REGEXP_LIKE('ë', '[ë]') 
    
    +0

    사실, 내가 아는 한 테스트 한 결과, 예제가 작동하지 않습니다. 문자 a-z와 일치하고, 문자열의 시작 부분과 일치합니다. 이 정규식과 일치하는 문자열이 없습니다. 이런 식으로 ('^ ëéïíìì ~ #] 등)'블랙리스트 '할 수 있지만'금지 된 '문자가 많아'허용 된 '문자가 많기 때문에 필자는 화이트리스트에 충실해야합니다. – TacoV

    +0

    예, 테스트하지 않고 편집 했으므로 이제 작동 중입니다. – SverreN

    +0

    +1 멋진 검색 결과가 될 것입니다. 물론 블랙리스트는 원래 설정에 따라 다소 달라 지므로 받아들이 기 전에 좀 더 일반적인 대답이 올지를 기다릴 것입니다. – TacoV