【问题标题】:How to select all the columns of a table except one column?如何选择表格中除一列以外的所有列?
【发布时间】:2015-03-17 09:18:18
【问题描述】:

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

我有将近 259 列我不能在 SELECT 语句中提及 258 列。

还有其他方法吗?

【问题讨论】:

  • 您使用的是哪个 DBMS?
  • 您已经有了一个包含 259 列的表。为什么要在意少选一个?你已经做了一个数据库的怪物和一个结果集的怪物,一列不会有什么不同。
  • 不,这是不可能的。您必须列出每一列(或编写一个为您执行此操作的函数)。但是许多 SQL 客户端可以帮助您通过自动完成自动“生成”该列表。另外,您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • @GiriPrasad 在 Management Studio 中,您可以右键单击表格,选择 Script table as -> Select to -> New query window。这将生成一个包含所有列的选择,您可以删除不需要的列。

标签: sql sql-server


【解决方案1】:

您可以使用这种方法从除一列之外的所有列中获取数据:-

  1. 将所有数据插入到临时表中
  2. 然后从临时表中删除不需要的列
  3. 从临时表中获取数据(这不会包含被移除列的数据)
  4. 删除临时表

类似这样的:

SELECT * INTO #TemporaryTable FROM YourTableName

ALTER TABLE #TemporaryTable DROP COLUMN Columnwhichyouwanttoremove

SELECT * FROM #TemporaryTable 

DROP TABLE #TemporaryTable 

【讨论】:

  • 你怎么知道 Giri 正在使用哪个 DBMS?
  • @a_horse_with_no_name:- 我不知道这就是为什么我说它只是一种方法
  • 感谢您的回复。似乎是一个有用的解决方案
  • 我必须承认,这是一个新颖的解决方案。但是,每次需要执行查询时,这会给繁忙的服务器带来相当大的负载。而这一切都是因为一位数据库开发人员受到了懒惰的攻击。 “我确实不能在 select 语句中提到 258 列”!
  • 事实上,再想一想,我想我会与任何执行此类代码的程序员坐下来很长时间。当然,我还想与设计此类表格的人进行长时间的讨论,然后再与请求此类查询的分析师进行一次长时间的讨论。人,头会滚动!
【解决方案2】:

创建一个视图。是的,在视图创建语句中,您必须列出每个...和...每个...字段...按...名称。

一次。

然后就是select * from viewname

【讨论】:

    【解决方案3】:

    这不是通用解决方案,但某些数据库允许您使用正则表达式来指定列。

    例如,在 Hive 的情况下,以下查询选择除 ds 和 hr 之外的所有列:

    SELECT `(ds|hr)?+.+` FROM sales
    

    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select#LanguageManualSelect-REGEXColumnSpecification

    【讨论】:

    • 我是一个认真的 hive 开发人员,但我不知道这一点 - 很酷。
    • 这个正则表达式有缺陷。如果要排除 dayday_hour 两列,(day|day_hour)?+.+ 仍将匹配 day_hour 列。那是因为正则表达式引擎渴望|。虽然将顺序更改为(day_hour|day)?+.+ 可以解决此问题,但更好的方法是使用负前瞻,(?!(day|day_hour)$).+
    • 我正在使用 Hive,但不知何故它给了我一个错误,说 Invalid table alias or column reference。似乎它正在读取“(colname)?+。+”作为文字列名。有什么解决办法吗?谢谢。
    【解决方案4】:

    您可以从 sys.columns 表中获取列名详细信息

    尝试以下查询:

    SELECT * FROM SYS.COLUMNS 
    WHERE object_id = OBJECT_ID('dbo.TableName') 
    AND [Name] <> 'ColumnName'
    
    DECLARE @sql as VARCHAR(8000)
    SET @sql = 'SELECT '
    
    SELECT @sql += [Name] + ', ' FROM SYS.COLUMNS 
    WHERE object_id = OBJECT_ID('dbo.TableName') 
    AND [Name] <> 'ColumnName'
    
    SELECT @sql += ' FROM Dbo.TableName'
    
    EXEC(@sql)
    

    【讨论】:

      【解决方案5】:

      有很多可用的选项,其中之一是:

       CREATE TEMPORARY TABLE temp_tb SELECT * FROM orig_tb;
       ALTER TABLE temp_tb DROP col_x;
       SELECT * FROM temp_tb;
      

      这里 col_x 是您不想包含在 select 语句中的列。

      看看这个问题:Select all columns except one in MySQL?

      【讨论】:

      • 感谢您的回复
      【解决方案6】:

      我只是想回应@Luann 的评论,因为我一直使用这种方法。

      只需右键单击表格 > 将表格编写为 > 选择到 > 新建查询窗口。

      您将看到选择查询。只需取出您要排除的列,您就有了首选的选择查询。

      【讨论】:

      • 我也得到了简单的解决方案 - 更简单的是使用“选择前 1000 行”。 :)
      【解决方案7】:

      如果您使用DataGrip,您可以执行以下操作:

      1. 输入您的 SELECT 语句SELECT * FROM &lt;your_table&gt;;
      2. 将光标放在* 上,然后按Alt+Enter
      3. 您将获得带有Expand column list 选项的弹出菜单
      4. 点击它,它会将* 转换为完整的列列表
      5. 现在您可以删除不需要的列

      Here is a link for an example on how to do it.

      【讨论】:

      • 这是一个很好的解决方案
      【解决方案8】:

      您可以通过简单查询来检索列名列表,然后通过 apply where 查询删除这些列。

      SELECT * FROM (
      SELECT COLUMN_NAME
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_NAME = N'TableName'
      ) AS allColumns
      WHERE allColumns.COLUMN_NAME NOT IN ('unwantedCol1', 'unwantedCol2')
      

      【讨论】:

      • 可以用一个where子句来完成,不需要从select中选择
      【解决方案9】:

      无需创建新表,您可以简单地做(例如使用 mysqli):

      1. 获取所有列
      2. 遍历所有列并删除您想要的内容
      3. 提出您的问题

      $r = mysqli_query('SELECT column_name FROM information_schema.columns WHERE table_name = table_to_query');
      
      $c = count($r); while($c--) if($r[$c]['column_name'] != 'column_to_remove_from_query') $a[] = $r[$c]['column_name']; else unset($r[$c]);
      
      $r = mysqli_query('SELECT ' . implode(',', $a) . ' FROM table_to_query');
      

      【讨论】:

        【解决方案10】:

        尝试以下查询:

        DECLARE @Temp NVARCHAR(MAX); 
        DECLARE @SQL NVARCHAR(MAX);
        
        SET @Temp = '';
        SELECT @Temp = @Temp + COLUMN_NAME + ', ' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='Person' AND COLUMN_NAME NOT IN ('Id')  
        
        SET @SQL = 'SELECT ' + SUBSTRING(@Temp, 0, LEN(@Temp)) +' FROM [Person]';
        EXECUTE SP_EXECUTESQL @SQL;
        

        【讨论】:

          【解决方案11】:

          在您的情况下,在对象资源管理器中展开该数据库的列。将列拖入查询区域。

          然后只需删除一两列您不想要的列,然后运行它。我愿意接受任何比这更容易的建议。

          【讨论】:

            【解决方案12】:

            只有一种方法可以实现这个给定的列名。没有找到其他方法。您必须列出所有列名

            【讨论】:

            • 虽然您所说的可能是一般情况,但有多个答案描述了可以实现预期结果的[角落]案例。
            猜你喜欢
            • 1970-01-01
            • 2018-12-16
            • 2013-01-01
            • 2013-08-10
            • 2013-03-23
            • 1970-01-01
            • 1970-01-01
            • 2020-12-17
            • 1970-01-01
            相关资源
            最近更新 更多