2017-12-20 18 views
0

데이터 형식이 varchar 인 데이터베이스와 열 (y)에 테이블 (x)이 있습니다. 이 열은 1., 2 \, .5, 2], 4.3 등의 값을 포함합니다.Oracle varchar string replacement

점의 값이 뒤에있는 특수 문자를 제외한 열의 모든 값을 바꾸려고합니다.

예 : 2.3, 4.5, 7.1과 같은 값을 대체하고 싶지 않습니다.

dot 또는 dot으로 시작하는 값 뒤에 값이 없으면 dot을 null로 바꾸고 싶습니다.

예는 :

  • 1. 2.
  • 0.1 2. 0.2 1 2뿐만 아니라 교체해야 1로 대체한다.

나는 스크립트 아래 시도하지만

update <table_name> 
set <column_name> = regexp_replace(regexp_replace(column_name, '[^A-Z0-9 ]', '.'), 
               ' {2,}', ' ') 
/

이 도와주세요 작동하지 않았다.

Oracle 11g DB를 사용하고 있습니다.

+0

내가 이해하지 못하는 ... '1. , 2 \, .5, 2], 4.3'는 단일 행의 단일 입력 문자열입니까? 결과는 쉼표로 구분 된 숫자 목록 (정수 또는 소수)이어야합니다. 23 절을 왜 23 절로 바꿔야하는지 이해합니다. 그러나 왜'.2'를'0.2'로 대체하지 않고'.2'를'2'로 바꾸고 싶습니까? 많은 국가에서'.2'가'0.2'의 일반적인 변형이라고 알고 있습니까? ** 실제로 ** .2를'2 '로 바꾸고 싶다는 것을 확인해주십시오. 그러면 문제 진술을 바꾸기 위해 다시 오지 않을 것입니다. – mathguy

+0

그래서 소수점 이외에 쉼표 사이의 모든 특수 문자를 간단하게 제거하고 싶습니까? 문자열에 문자가있을 수 있습니까? 그렇다면 어떻게 처리해야합니까? 그런 다음 - 입력 문자열에'...., 32.9.2, .... '와 같은 것이 있으면 어떨까요? (소수점 두 자리?) 서명은 어떨까요? '2. , 30 $, + 12.5, -42.23'? 어떻게 처리해야합니까? – mathguy

+0

@mathguy 문자열이 단일 입력 문자열이 아닙니다. 내가 언급 한 각각의 문자열은 새로운 가치를 연속적으로 나타냅니다. .2를 0.2로 바꾸지 않고 2를 2로 바꾸려고하는 이유는 실제 값이 2이기 때문입니다. 일부 값의 데이터 마이그레이션 중에 숫자 앞에 점이 추가됩니다. 네, 모든 특수 문자를 제거하고 싶습니다. 문자열에 문자가 없습니다. 두 개의 소수점 문자열이 없습니다. +, -, $ 기호도 Null 값으로 대체해야합니다. –

답변

2

여기에는 한 가지 방법이 있습니다. 먼저 일반 표현식 함수를 사용하여 숫자와 마침표 이외의 모든 문자를 제거합니다. 그런 다음 TRIM을 결과에 적용하여 마침표가 첫 번째 또는 마지막 문자 인 경우에만 마침표를 제거 (제거)합니다.

WITH 절은 쿼리의 일부가 아닙니다. 나 자신을 위해 테스트 데이터를 만드는 것만 가능합니다. 실제 테이블 및 열 이름과 함께 쿼리 (SELECT ...)를 사용하십시오.

with 
    inputs (str) as (
    select '2.' from dual union all 
    select '-4.2' from dual union all 
    select '3?*' from dual union all 
    select '32.' from dual union all 
    select '.3' from dual union all 
    select '5$8' from dual 
) 
select str, trim('.' from regexp_replace(str, '[^0-9.]')) as new_str 
from inputs 
; 

STR NEW_STR 
---- ------- 
2. 2 
-4.2 4.2 
3?* 3 
32. 32 
.3 3 
5$8 58 
+0

굉장합니다. 그것은 효과가 있었다. 고마워요. –