如何在SQL中选择除一列之外的所有列?

11

你展示的查询是一种选择。另一个选择,虽然有点麻烦,是创建动态SQL。 - John Woo
这里有一个解决方案:链接 - Kermit
@JW. - 你能给我一些动态SQL的例子吗?因为我对此一无所知。 - user1987631
@njk - 好的,我会尝试那个。 - user1987631
3个回答

5
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)

13
太冗长了! - Chella

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

这将返回除了你想要排除的那一列之外的所有列。
详细解释:
根据 SQL Cheat Sheet 中的解释,sys.columns 是一个系统表,用于维护数据库中列的信息。对于数据库中添加的每一列,都会在 sys.columns 表中创建一条记录。每个列只有一条记录。 Name:列的名称。这在表对象内是唯一的。 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]

能否解释一下这里发生了什么? - The Terrible Child
1
@TheTerribleChild,我已经扩展了我的答案,进一步解释我们在这里做什么。 - Michael Eakins

1

在sql*plus中,

一种方法是按以下方式禁用:

sql> column age noprint
sql> SELECT * from TBLUser

然后,您可以使用还原

sql>column age off

否则您必须使用DBMS_SQL包动态地执行。


5
SQL PLUS 是针对 Oracle 数据库的工具,但这一点并未被原帖作者提及。 - Michael Eakins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接