【问题标题】:How to select all columns in sql except one column? [duplicate]如何选择sql中除一列之外的所有列? [复制]
【发布时间】:2013-01-01 18:17:30
【问题描述】:

可能重复:
SQL exclude a column using SELECT * [except columnA] FROM tableA?

是否可以选择除一列以外的所有列??

这是所有列名:id、name、address、age

SELECT id, name, address from TBLUser

我不想使用这个 select 语句,因为我的表的列数彼此不同。

【问题讨论】:

  • 您显示的查询是另一种选择。另一个,有点让人头疼,是创建一个动态 SQL。
  • Here's 一个解决方案。
  • @JW。 - 你能给我一些动态sql的例子吗,因为我不知道
  • @njk - 好的,我会试试的

标签: mysql sql sql-server


【解决方案1】:
declare @cols varchar(max), @sql varchar(max)
SELECT  @cols = STUFF
    (
        ( 
            SELECT DISTINCT '], [' + name
            FROM sys.columns
            where object_id = (
                select top 1 object_id from sys.objects
                where name = 'TBLUser'
            )
            and name not in ('age')
            FOR XML PATH('')
        ), 1, 2, ''
    ) + ']'
select @sql = 'select ' + @cols + ' from TBLUser'  
exec (@sql)

【讨论】:

  • 太长了……!
【解决方案2】:

怎么样:

SELECT * FROM sys.columns 
WHERE Name <> N'Column To Exclude' and Object_ID = Object_ID(N'TBLUser')

这将返回除您要排除的列之外的所有列。

扩展解释:

根据SQLCheat Sheet的这个解释

sys.columns 是系统表,用于维护数据库中列的信息。对于数据库中添加的每一列,都会在 sys.columns 表中创建一条记录。每列只有一条记录

名称:列的名称。这在表对象中是唯一的。

Object_id:object_id 是该列所在表的唯一标识符。我们将使用此列将 sys.columns 与 sys.tables 连接起来,以便获取不同表中的列。

我们从 sys.columns 中选择名称与您提供的名称不相等的所有结果,请将 'Column To Exclude' 替换为您的列名称。我们还要求 object_id 等于您提供的 object_id。 object_id 是一个数字,表示您要从中过滤掉一列的表。在这种操作情况下,表是 TBLUser,在其他用途​​中它会像这样 object_id(N'[dbo].[YourTable]'),您可以将 [YourTable] 替换为您自己的表名

【讨论】:

  • 想解释一下这里发生了什么?
  • @TheTerribleChild 我已经扩展了我的答案,以进一步解释我们在这里做什么。
【解决方案3】:

在 sql*plus 中,

一种方法是禁用如下:

sql> column age noprint
sql> SELECT * from TBLUser

然后,您可以使用恢复

sql>column age off

否则您必须使用 DBMS_SQL 包动态用户。

【讨论】:

  • SQL PLUS 适用于 OP 未提及的 Oracle
猜你喜欢
  • 2014-08-24
  • 2013-03-23
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多