我有一张桌子
此查询将按原样选择所有列。
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
结果应该使列4的所有列都保持不变。
答案 0 :(得分:0)
遗憾的是,“除了某些东西之外的所有列”都没有运营商。你必须指定所有这些:
SELECT column1, column2, column3, SUBSTRING(column4, LENGTH(column4) - 5), etc
FROM mytable
答案 1 :(得分:0)
语法应该是这样的:
select column1,
column2,
column3,
case
when column4 is not null
then substring(column4, length(column4) - 5)
end column4 ,
column5
from table;
答案 2 :(得分:0)
这取决于你想要完成什么。这有效:
select substr(column4, 0, 5), t1.* from sometable t1;
但是,它会返回column4两次。一次有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。如果需要截断多个列并根据需要添加其他表,请添加更多特殊情况。