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

Posted

技术标签:

【中文标题】如何在修剪其中一列的结果时选择所有列?【英文标题】:How to select all columns while trimming the result of one of them? 【发布时间】:2016-12-02 10:57:15 【问题描述】:

我有一张桌子

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

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 之外的所有列保持不变。

【问题讨论】:

别偷懒,一一指定! (但你可以跳过这种情况,只做子字符串部分。) @jar 一个表有20多列,10多张表。我至少需要指定 200 列。没有更好的办法吗? 这可能有点痛苦,但总是更喜欢列列表,select * vs select column 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

语法应该是这样的:

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

【讨论】:

【参考方案3】:

这有点取决于你想要完成什么。这有效:

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。如果您需要截断多个列并根据需要添加其他表,请添加更多特殊情况。

【讨论】:

以上是关于如何在修剪其中一列的结果时选择所有列?的主要内容,如果未能解决你的问题,请参考以下文章

如何只返回一列的计数结果?

如何在excel中将两列对应的数据以其中一列的排序 求教各位高手

如何选择表格中除一列以外的所有列?

SQLServer如何修改一列的列名呢?

如何根据另一列的值从 Spark DataFrame 中选择特定列?

如何按一列的最大值获取SQL行,按另一列分组