2017-02-27 3 views
0

매우 긴 금액을 comma separated value in oracle으로 변환해야한다는 요구 사항이 있습니다. 나는 구글에서 검색하고 있었다. 하지만 작은 숫자에 대해서만 작동하는 몇 가지 솔루션이 있습니다. 그러나 긴 숫자는 아닙니다. 아래는 내가 가진 해결책입니다. 그러나 제대로 작동하지 않습니다. 나는 ############를 얻고 있었다. .. 만일 내가 아래를 달리게하면.오라클에 쉼표가있는 긴 숫자 형식

SELECT TO_CHAR(6965854565787645667634565432234565432345643265432345643242087, 
'99G999G999G9999', 'NLS_NUMERIC_CHARACTERS=",."') as test 
FROM dual; 

원하는 출력 :

6,965,854,565,787,645,667,634,565,432,234,565,432,345,643,265,432,345,643,242,087

제발 도와주세요. 미리 감사드립니다.

+1

그 번호는 어디에서 왔으며 어떤 데이터 유형입니까? 이미 문자열이라면이 작업을 수행 할 수 있습니다. 그러나 mathguy가 숫자로 말하면 오라클의 허용 된 정밀도를 초과합니다. –

답변

1

오라클의 숫자는 유효 자릿수가 38자를 초과 할 수 없습니다. 당신은 그 이상을 가지고 있습니다.

내가 할 수있는 "양"의 종류는 무엇입니까? 오라클은 실제 가치를 처리하도록 설계되었습니다. 게시 한 샘플 번호의 의미는 무엇입니까?

덧붙여 덧글 (기존)의 원본 포스터는 더 짧은 숫자로 같은 오류가 발생하며 34 자리 만 나타납니다.

두 가지 문제. 첫째, 형식 모델은 최소한 9 자리 숫자가 필요합니다. to_char(100000, '9G999')은 형식 모델이 4 자리 만 허용하기 때문에 출력은 ####이지만 입력은 6 자리입니다.

그런 다음 SQL * Plus와 같이 프런트 엔드 응용 프로그램에서 출력이 여전히 잘못된 것처럼 보일 수 있습니다. SQL * Plus에서 숫자 열의 기본 너비는 10입니다 (필자는 믿습니다). 이는 예를 들어 set numwidth 38 명령으로 38로 변경할 수 있습니다. Toad 및 SQL Developer와 같은 다른 프런트 엔드에서 기본 숫자 너비는 그래픽 사용자 인터페이스를 통해 변경할 수있는 설정입니다.

더 많은 추가 - 실제로 to_char의 결과는 문자열이며, 길이의 기본 문자열로 프런트 엔드에서 확인 표시되어야하므로 숫자 폭은 아마 무관하다. (그리고, 어떤 경우에, 그것은 to_char()의 결과를 포함, 문자열의 표시에 영향을주지 않습니다.) 쿼리가 도움이 될 수 있습니다 아래의 경우

+1

그 숫자는 우주의 원자 수보다 많습니다 ...;) – BobC

+0

38 자리 미만의 숫자로 시도했습니다. 6965854565787645667634565432234565 여전히 같은 # ##### ... –

+0

@SreeBhanu를 보여줍니다 .- 좋아, 나는 초기 대답을 추가했다. – mathguy

1
SELECT TO_CHAR(
    6676345654322345654323456432654323456, 
    '999G999G999G999G999G999G999G999G999G999G999G999G999', 
'NLS_NUMERIC_CHARACTERS=",."') as test FROM dual 

    TEST 
    ------------------------------------------------------------ 
     6,676,345,654,322,345,654,323,456,432,654,323,456 
+0

잘 모르겠습니다.OP가 제공 한 번호를 실제로 사용하려고하면 ORA-01481 (잘못된 숫자 형식 모델)이 표시됩니다. –

+0

업데이트 당 38 자의 숫자가 사용됩니다. – BobC

+0

'column' 명령은 필요하지 않습니다. 기본적으로 SQL \ * Plus는 문자열 열의 가장 긴 문자열을 수용하도록 확장됩니다. – mathguy

2

확인하시기 바랍니다.

SELECT ltrim(regexp_replace('00' 
    || '6965854565787645667634565432234565432345643265432345643242087', '(...)', ',\1'),',|0') AS t 
FROM dual; 
+0

감사합니다 Tajinder ..이 작품 .. –

1

@AlexPoole은 아마도 입력 내용이 문자열이라고 지적했습니다.

나는 그 느낌을 얻지 못했다. 실제로 입력이 문자열이라면 길이가 99 자리 이하라는 것을 알고 있다면 아래와 같이 할 수 있습니다. 문자열이 99보다 길 수 있다면 아래의 99를 3의 충분히 큰 배수로 바꾸십시오 (또는 계산 된 값으로 대체 할 수 있습니다, 3 * ceil(length(str)/3)).

with 
    inputs (str) as (
     select '12345678912345' from dual 
    ) 
-- WITH clause is only for testing/illustration, not part of the solution 
select ltrim(regexp_replace(lpad(str, 99, ','), '(.{3})', ',\1'), ',') as test 
from inputs; 

TEST 
------------------ 
12,345,678,912,345