2012-02-27 2 views
4

실제 테이블을 쿼리하지 않고 (Oracle) SQL을 실행할 수있는 가능성을 찾고 있습니다. Here I found a tip with the DUAL table. Thats 아주 좋아. 하지만 "아무데도"에서 여러 행을 선택하는 간단한 해결책을 찾고 있습니다. 그게 가능하니? 여기에 내가 필요 않는, 생각할 수있는 가장 짧은 쿼리입니다 :SQL (Oracle) 정적 데이터가 포함 된 실제 테이블없이 선택

Select 1, 'foo' FROM DUAL union 
Select 2, 'bar' FROM DUAL union 
Select 3, 'more stuff' FROM DUAL 

그러나 나는 내 결과에 더 많은 행을하려는 경우, 그것은 꽤 손재주가 가져옵니다. 더 짧은 길이 있습니까? 뭔가 같은 것

Select 1, 'foo'; 2, 'bar'; 3, 'more stuff' from dual 
or 
Select * from (1, 'foo') union (2, 'bar') union (3, 'more stuff') 

나는 알고있다, 그러나 그것은 당신이 생각을 가지고 있니? 쿼리 결과를 쉽게 바꾸는 방법이 있습니까? 다음과 같이하십시오 :

Select transposed (1, 'foo', 2, 'bar', 3, 'more stuff') from dual 

"오버 헤드 문자"를 가장 낮게 유지하고 싶습니다.

답변

6

당신은 더 레코드를 생성 할 connect by level을 사용할 수 있습니다 - 뭔가 같은 : 경우

select level, decode(level, 1,'foo', 2,'bar', 3,'more stuff') 
from dual connect by level <= 3 
+0

Fancy ... decode()를 사용하지 않았지만 제대로 작동하고 "오버 헤드"를 고정 된 값으로 유지합니다. 큰! 고맙습니다! – Sauer

2

가 여러 열 - 다음이뿐만 아니라 작품 - 그것이 작동하는 방법

다음
select 
    REGEXP_SUBSTR (jango,'^[^#]*') as f1, 
    REGEXP_SUBSTR(REGEXP_REPLACE(jango,'^([^#]*#){1}', ''),'^[^#]*') as f2, 
    REGEXP_REPLACE(jango,'^([^#]*#){2}', '') as f3 
from 
    (
    Select decode(level, 
    1, 'foo#koo#joo', 
    2, 'bar#loo#too' , 
    3, 'more stuff#doo#dingo') as jango 
    from dual connect by level <= 20 
) 

는 경우 - 내부 쿼리는 위와 동일합니다 # 여러 개의 컬럼을 사용하여 #을 추가했습니다 - 그것이 정규 표현식 패밀리의 일부가 아니기 때문에 우리가 이스케이프해야 할 필요가 있다는 것을 알아야합니다.

   Jango 
------------------- 
foo#koo#joo 
bar#loo#too 
more stuff#doo#dingo 

이제 다음 조각이 출력 열에서 선택 - -

Select decode(level, 
    1, 'foo#koo#joo', 
    2, 'bar#loo#too' , 
    3, 'more stuff#doo#dingo') as jango 
    from dual connect by level <= 20 

는 다음을 제공합니다 두 번째 열에 대해, #

REGEXP_SUBSTR (jango,'^[^#]*') as f1, 

    O/p --> foo 

개까지 아무것도 '장고'우리는 내용을 제거 첫 번째 열의 #

REGEXP_REPLACE(jango,'^([^#]*#){1}', '') 

    we get --> koo#joo 

이제 첫 번째 단계 - 첫 번째 필드를 가져옵니다.

{1} 개 필드를 늘릴 수 있습니다.

+1

오, 소년 ... 너무 많이. 하지만 시도를 위해 +1 :) 감사합니다! – Sauer

관련 문제