我们都知道,要从表中选择所有列,可以使用
SELECT * FROM tableA
是否有一种方法可以在不指定所有列的情况下从表中排除列?
SELECT * [except columnA] FROM tableA
我所知道的唯一方法是手动指定所有列并排除不需要的列。这真的很耗时,所以我正在寻找方法来节省时间和精力,以及未来的维护表应该有更多/更少的列。
我们都知道,要从表中选择所有列,可以使用
SELECT * FROM tableA
是否有一种方法可以在不指定所有列的情况下从表中排除列?
SELECT * [except columnA] FROM tableA
我所知道的唯一方法是手动指定所有列并排除不需要的列。这真的很耗时,所以我正在寻找方法来节省时间和精力,以及未来的维护表应该有更多/更少的列。
当前回答
如果有人像我一样使用MySql,请使用这个:
CREATE TABLE TempTable AS SELECT * FROM #YourTable;
ALTER TABLE TempTable
DROP COLUMN #YourColumn;
SELECT * FROM TempTable;
DROP TABLE TempTable;
其他回答
就像其他人说的那样,没有办法做到这一点,但如果你使用Sql Server,我使用的一个技巧是将输出更改为逗号分隔,那么就这样做
select top 1 * from table
并从输出窗口中剪切整个列列表。然后你可以选择你想要的列,而不必把它们全部输入。
下面是生成在查询中使用的列的列表(不是自动查询,因为这没有指定):
SELECT
GROUP_CONCAT(
CONCAT('`', `COLUMN_NAME`, '`')
SEPARATOR ',\n'
) AS `cols`
FROM information_schema.`COLUMNS`
WHERE `TABLE_SCHEMA` = 'db'
AND `TABLE_NAME` = 'table_name_here'
AND `COLUMN_NAME` NOT IN ('exclude_col1', 'exclude_col2')
会产生:
`included_col1`,
`included_col2`,
`included_col3`
然后你可以复制这个在查询中使用:
SELECT
`included_col1`,
`included_col2`,
`included_col3`
FROM db.table_name_here
No.
轻维护的最佳实践是只指定所需的列。
至少有两个原因:
这使得客户端和数据库之间的契约是稳定的。每次都是相同的数据 性能,涵盖指标
编辑(2011年7月):
如果您从对象资源管理器中拖动表的列节点,它会在查询窗口中为您放置一个CSV列列表,从而实现您的目标之一
DECLARE @SQL VARCHAR(max), @TableName sysname = 'YourTableName'
SELECT @SQL = COALESCE(@SQL + ', ', '') + Name
FROM sys.columns
WHERE OBJECT_ID = OBJECT_ID(@TableName)
AND name NOT IN ('Not This', 'Or that');
SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + @TableName
EXEC (@SQL)
更新:
如果您经常使用这个任务,还可以创建一个存储过程来处理它。 在这个例子中,我使用了内置的STRING_SPLIT(),它在SQL Server 2016+上可用, 但如果你需要,有很多例子教你如何在SO上手动创建它。
CREATE PROCEDURE [usp_select_without]
@schema_name sysname = N'dbo',
@table_name sysname,
@list_of_columns_excluded nvarchar(max),
@separator nchar(1) = N','
AS
BEGIN
DECLARE
@SQL nvarchar(max),
@full_table_name nvarchar(max) = CONCAT(@schema_name, N'.', @table_name);
SELECT @SQL = COALESCE(@SQL + ', ', '') + QUOTENAME([Name])
FROM sys.columns sc
LEFT JOIN STRING_SPLIT(@list_of_columns_excluded, @separator) ss ON sc.[name] = ss.[value]
WHERE sc.OBJECT_ID = OBJECT_ID(@full_table_name, N'u')
AND ss.[value] IS NULL;
SELECT @SQL = N'SELECT ' + @SQL + N' FROM ' + @full_table_name;
EXEC(@SQL)
END
然后就是:
EXEC [usp_select_without]
@table_name = N'Test_Table',
@list_of_columns_excluded = N'ID, Date, Name';
这是我在这个例子中经常用到的
declare @colnames varchar(max)=''
select @colnames=@colnames+','+name from syscolumns where object_id(tablename)=id and name not in (column3,column4)
SET @colnames=RIGHT(@colnames,LEN(@colnames)-1)
@colnames看起来像column1,column2,column5