我们都知道,要从表中选择所有列,可以使用
SELECT * FROM tableA
是否有一种方法可以在不指定所有列的情况下从表中排除列?
SELECT * [except columnA] FROM tableA
我所知道的唯一方法是手动指定所有列并排除不需要的列。这真的很耗时,所以我正在寻找方法来节省时间和精力,以及未来的维护表应该有更多/更少的列。
我们都知道,要从表中选择所有列,可以使用
SELECT * FROM tableA
是否有一种方法可以在不指定所有列的情况下从表中排除列?
SELECT * [except columnA] FROM tableA
我所知道的唯一方法是手动指定所有列并排除不需要的列。这真的很耗时,所以我正在寻找方法来节省时间和精力,以及未来的维护表应该有更多/更少的列。
当前回答
下面是生成在查询中使用的列的列表(不是自动查询,因为这没有指定):
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
其他回答
是否有一种方法可以在不指定的情况下从表中排除列 所有的列?
以通常的方式使用声明性SQL是不行的。
我认为你提出的语法是有价值的,是好的。事实上,关系数据库语言‘Tutorial D’有一个非常相似的语法,关键字ALL BUT后面跟着一组属性(列)。
然而,SQL的SELECT *已经受到了很多批评(@Guffa的回答是一个典型的反对),所以我不认为SELECT ALL BUT会很快进入SQL标准。
我认为最好的“工作”是创建一个视图,只有你想要的列,然后选择*从那个视图。
我不知道有任何数据库支持这个(SQL Server, MySQL, Oracle, PostgreSQL)。它绝对不是SQL标准的一部分,所以我认为你必须只指定你想要的列。
当然,您可以动态地构建SQL语句并让服务器执行它。但是这为SQL注入打开了可能性。
你可以创建一个包含你想要选择的列的视图,然后你可以从视图中选择*…
基本上,你不能做你想做的事情,但你可以得到正确的工具来帮助你,让事情变得更容易一些。
如果你看一下Red-Gate的SQL提示,你可以输入“SELECT * FROM MyTable”,然后把光标移到“*”后面,然后点击<TAB>来展开字段列表,并删除那些你不需要的字段。
这不是一个完美的解决方案——但却是一个非常好的解决方案!:-)太糟糕了MS SQL Server Management Studio的智能感知仍然不够智能,无法提供此功能.......
Marc
当然,就像他们说的,你需要用动态sql实现。这是我的实现:
SET NOCOUNT ON
DECLARE @Table NVARCHAR(100) = 'Table' --Table to Select
DECLARE @ExcludeColumns AS TABLE (ColumnName VARCHAR(255))
INSERT INTO @ExcludeColumns VALUES ('ExcludedColumn1'),('ExcludedColumn2') --Excluded columns
DECLARE @SelectedColumns NVARCHAR(MAX) = ''
SELECT
@SelectedColumns += CASE WHEN LEN(@SelectedColumns) = 0 THEN '' ELSE ',' END + '[' + COLUMN_NAME + ']'
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = @Table AND COLUMN_NAME NOT IN (SELECT ColumnName FROM @ExcludeColumns)
DECLARE @sqlStatement NVARCHAR(MAX) = 'SELECT ' + @SelectedColumns + ' FROM [' + @Table + ']'
PRINT @sqlStatement
EXEC (@sqlStatement)