2016-12-02 2 views
1

테이블이 있습니다그 중 하나의 결과를 트리밍하는 동안 모든 열을 선택하는 방법은 무엇입니까?

이 쿼리는 모든 열을 그대로 선택합니다.

select * from t1 

하지만 이러한 열 중 하나를 잘라야합니다.

이렇게하면됩니까?

select * 
    case 
    when column4 is not null 
     then substr(column4, - 5) 
from table 

또는 내가 변경 column4 exept 모든 열을 가져야한다

select * 
    case 
    when column4 is not null 
     then column4 = substr(column4, - 5) 
from table 

결과를해야합니까.

+2

게으르면 안됩니다. 모두 지정하십시오! (단, 하위 문자열 부분 만 건너 뛰어도됩니다.) – jarlh

+0

@jar 테이블에 20 개 이상의 열과 10 개 이상의 테이블이 있습니다. 최소한 200 개의 열을 지정해야합니다. 더 좋은 방법이 없을까요? –

+1

약간의 어려움이 있지만 항상 열 목록을 선호 할 수 있습니다. [select * vs select column] (http://stackoverflow.com/questions/3180375/select-vs-select-column) –

답변

0

불행히도 "무언가를 제외한 모든 열"에 대한 연산자가 없습니다. 당신은 그들 모두를 지정해야 할 것 :

SELECT column1, column2, column3, SUBSTRING(column4, LENGTH(column4) - 5), etc 
FROM mytable 
0

구문은 다음과 같이해야한다 :

select column1, 
     column2, 
     column3, 
     case 
     when column4 is not null 
     then substring(column4, length(column4) - 5) 
     end column4 , 
     column5 
    from table; 
0

그것은 수행하려는 작업에 조금 따라 달라집니다. 작동 방식 :

select substr(column4, 0, 5), t1.* from sometable t1; 

그러나 열 4를 두 번 반환합니다. 한 번 5 문자 (고정 길이를 사용하지 않고 마지막 5 글자를 버리고 싶은 경우 다른 답변과 같이 길이를 사용하고 목표가 무엇인지 명확하게하지 말고) 모든 문자를 한 번 사용하십시오.

user_tab_columns를 사용하여 PL/SQL로 SQL을 생성 할 수도 있습니다. 이런 식으로 뭔가를 저장하고 싶다면 다음과 같이 입력하십시오 :

declare 
    v_sql varchar2(1024) := null; 
begin 
    for rec in (select column_name, table_name from user_tab_columns 
    where table_name = 'TEST1') loop 
    if v_sql is null then 
     v_sql := 'select '; 
    else 
     v_sql := v_sql || ','; 
    end if; 
    if rec.column_name = 'C2' then 
     v_sql := v_sql || ' substr(' || rec.table_name || '.c2, 0, 5)'; 
    else 
     v_sql := v_sql || rec.table_name || '.' || rec.column_name; 
    end if; 
    end loop; 
    v_sql := v_sql || ' from test1'; 
    dbms_output.put_line(v_sql); 
end; 
/

코드 스타일에는 포인트가 없지만 SQL을 작동하고 인쇄합니다. 여러 열을 자르고 필요에 따라 다른 표를 추가해야하는 경우 특별한 경우를 추가하십시오.