문제

다음과 동등하거나 대안이 있습니까?

SELECT mix_type || ' (' || mix_num || ')' as description
  FROM acid_batch
 WHERE mix_num < 10

Oracle에는 Printf 스타일 형식과 같은 것이 있습니까?

SELECT printf("%s (%s)", mix_type, mix_num) as description,
  FROM acid_batch
 WHERE mix_num < 10
도움이 되었습니까?

해결책

이 방식으로 서식 문자열을 적용하는 내장 된 Oracle 함수는 없습니다. 이 특정 예제에 대해 사용자 정의 기능을 작성하는 것은 쉽지만 Pl/SQL 기반 Printf 구현을 작성하는 것은 어려울 것입니다.

이 문제가 빈번한 경우 더 풍부한 문자열 처리 환경을 위해 Java 호출을 감싸는 Oracle 기능을 작성할 수 있습니다.

다른 팁

내가 생각할 수있는 Oracle의 Printf와 가장 가까운 표준 근사치는 IS utl_lms.format_message. 그러나 SQL 문에서는 작동하지 않습니다. 즉, 이것이 괜찮습니다.

begin
  dbms_output.put_line(
    utl_lms.format_message('hello %s, the number is %d', 'world', 42)
  );
end;
/

그러나 이것은 a를 준다 ORA-00902 : 유효하지 않은 데이터 유형 오류:

select utl_lms.format_message('hello %s, the number is %d', 'world', 42)
  from dual

당신을위한 또 다른 아이디어 : 나는 특히 템플릿이 복잡 할 때 이런 종류의 것에 유용하다는 것을 알았습니다.

SELECT REPLACE(REPLACE(
        '%mix_type% (%mix_num%)' /*template*/
       ,'%mix_type%', mix_type)
       ,'%mix_num%' , mix_num ) as description,
FROM   acid_batch
WHERE  mix_num < 10

유일한 단점은 많은 것을 추가해야한다는 것입니다. REPLACE(교체 할 변수가 있지만 템플릿에 몇 번이나 나타나든간에 변수 당 하나만 있어야합니다.

(참고 : "%"를 구분 기자로 사용하는 데 특별한 의미는 없으며, 그것은 단지 내 개인적인 관습 일뿐입니다. 예를 들어 다른 패턴을 선택할 수 있습니다. <mix_type> 또는 [mix_type])

이 특정 사례의 경우 과잉처럼 보이지만 경우에 따라 훨씬 쉽게 일할 수 있습니다.

template := 'bla bla %a% %b% %a%';
output := REPLACE(REPLACE(template
    ,'%a%', some_complex_expression)
    ,'%b%', b);

위를 다음과 비교하십시오.

output := 'bla bla ' || some_complex_expression || ' ' || b || ' ' || some_complex_expression;

나는 간단한 템플릿 엔진을 만들었습니다 ora_te (github) Oracle SQL / PLSQL 용. 그것의 도움으로 당신의 목표는 다음과 같은 방법으로 달성 할 수 있습니다.

템플릿 문자열의 여러 구문 분석을 사용한 비 안정 구현 :

with acid_batch as (
  select rownum as mix_type, rownum + 2 as mix_num 
  from all_objects
  where rownum < 10
)
--
SELECT pk_te.substitute('$1 ($2)', ty_p( mix_type, mix_num ) ) as description
FROM acid_batch
WHERE mix_num < 10;

일회성 컴파일 (구문 분석)을 사용한 효과적인 구현 :

with acid_batch as (
  select rownum as mix_type, rownum + 2 as mix_num 
  from all_objects
  where rownum < 10
),
--
o as ( 
  select ty_te.compile_numbered( '$1 ($2)' ) te from dual
)
SELECT pk_te.substitute( o.te, ty_p( mix_type, mix_num ) ) as description
FROM acid_batch, o
WHERE mix_num < 10;

BTW는 또한 지명 된 자리 표시자를 지원합니다.

선택에서 해결할 수 있습니다.

SELECT mix_type || '(' ||  mix_num || ')' as description,
FROM acid_batch
WHERE mix_num < 10

또한 기능을 살펴 봐야합니다

to_char

to_date

to_number

그들이 당신이 대표하는 것을 원하는 방식에 대해 당신의 세분화를주는 것에 따라.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top