Sql 如何在修剪其中一列的结果时选择所有列?

Sql 如何在修剪其中一列的结果时选择所有列?,sql,oracle,case,trim,Sql,Oracle,Case,Trim,我有一张桌子 此查询将按原样选择所有列 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) fro

我有一张桌子

此查询将按原样选择所有列

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
结果应该是除column4之外的所有列都保持不变。

不幸的是,“除某物以外的所有列”没有运算符。您必须指定所有这些选项:

SELECT column1, column2, column3, SUBSTRING(column4, LENGTH(column4) - 5), etc
FROM   mytable
不幸的是,“除某些内容外的所有列”没有运算符。您必须指定所有这些选项:

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

语法应如下所示:

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

语法应如下所示:

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

这取决于你想完成什么。这项工作:

select substr(column4, 0, 5), t1.* from sometable t1;
但是,它返回第4列两次。一次包含5个字符(如果您想放弃最后5个字符而不是使用固定长度,请使用其他答案中的长度,不清楚您的目标是什么),一次包含所有字符

您还可以使用user\u tab\u列用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。如果需要截断多个列并根据需要添加其他表,请添加更多特殊情况。

这取决于您想要完成的任务。这项工作:

select substr(column4, 0, 5), t1.* from sometable t1;
但是,它返回第4列两次。一次包含5个字符(如果您想放弃最后5个字符而不是使用固定长度,请使用其他答案中的长度,不清楚您的目标是什么),一次包含所有字符

您还可以使用user\u tab\u列用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。如果需要截断多个列并根据需要添加其他表,请添加更多特殊情况。

不要偷懒,请全部指定!(但您可以跳过这个例子,只需执行子字符串部分即可。)@jar一个表中有20多列和10多个表。我将需要指定至少200列。难道没有更好的方法吗?这可能有点痛苦,但总是喜欢列列表,不要偷懒,全部指定!(但您可以跳过这个例子,只需执行子字符串部分即可。)@jar一个表中有20多列和10多个表。我将需要指定至少200列。难道没有更好的方法吗?这可能有点痛苦,但总是喜欢列列表,