2016-12-02 17 views
1

我有一个表如何选择所有列,同时修剪其中一个的结果?

这个查询将按原样选择所有列。

select * from t1 

但我需要修剪其中的一列。

我可以这样做吗?

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

或者我需要

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

结果应该有exept column4不变的所有列。

+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个字符而不是使用固定长度,不清楚您的目标是什么),并使用所有字符,则使用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。如果需要截断多个列并根据需要添加其他表,请添加更多特殊情况。

相关问题