671 sql t-sql sql-server
我们都知道要从表中选择所有列,我们都可以使用
SELECT * FROM tableA
Run Code Online (Sandbox Code Playgroud)
有没有办法在不指定所有列的情况下从表中排除列?
SELECT * [except columnA] FROM tableA
Run Code Online (Sandbox Code Playgroud)
我知道的唯一方法是手动指定所有列并排除不需要的列.这非常耗时,所以我正在寻找节省时间和精力的方法,以及如果表有更多/更少的列,将来的维护.
谢谢!
小智 421
我同意所有人的意见......但如果我打算这样做,我可以这样做:
/* Get the data into a temp table */
SELECT * INTO #TempTable
FROM YourTable
/* Drop the columns that are not needed */
ALTER TABLE #TempTable
DROP COLUMN ColumnToDrop
/* Get results and drop temp table */
SELECT * FROM #TempTable
DROP TABLE #TempTable
Run Code Online (Sandbox Code Playgroud)
gbn*_*gbn 282
没有.
维护灯最佳做法是仅指定所需的列.
至少有两个原因:
编辑(2011年7月):
如果从对象资源管理器拖动Columns表的节点,它会在查询窗口中为您放置一个CSV列列表,从而实现您的目标之一
小智 66
在SQL(SQL Server)中执行此操作的自动方法是:
declare @cols varchar(max), @query varchar(max);
SELECT @cols = STUFF
(
(
SELECT DISTINCT '], [' + name
FROM sys.columns
where object_id = (
select top 1 object_id from sys.objects
where name = 'MyTable'
)
and name not in ('ColumnIDontWant1', 'ColumnIDontWant2')
FOR XML PATH('')
), 1, 2, ''
) + ']';
SELECT @query = 'select ' + @cols + ' from MyTable';
EXEC (@query);
Run Code Online (Sandbox Code Playgroud)
him*_*056 63
如果你不想写每个列名手动你可以使用Script Table As右键单击表或视图中SSMS这样的:

然后,您将在New Query Editor窗口中获得完整的选择查询,然后删除不需要的列,如下所示:

完成
cam*_*mpo 38
您可以创建一个包含您想要选择的列的视图,然后您只需从视图中选择*即可...
Ant*_*ull 29
是的,这是可能的(但不推荐).
CREATE TABLE contact (contactid int, name varchar(100), dob datetime)
INSERT INTO contact SELECT 1, 'Joe', '1974-01-01'
DECLARE @columns varchar(8000)
SELECT @columns = ISNULL(@columns + ', ','') + QUOTENAME(column_name)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'contact' AND COLUMN_NAME <> 'dob'
ORDER BY ORDINAL_POSITION
EXEC ('SELECT ' + @columns + ' FROM contact')
Run Code Online (Sandbox Code Playgroud)
代码说明:
SELECT @variable = @variable + ... FROM来连接的列名.此类型SELECT不会返回结果集.这可能是未记录的行为,但适用于每个版本的SQL Server.作为替代方案,您可以使用SET @variable = (SELECT ... FOR XML PATH(''))连接字符串.ISNULL仅当这不是第一个列名时,才使用该函数添加逗号.使用此QUOTENAME函数可以支持列名称中的空格和标点符号.WHERE子句隐藏我们不想看到的列.EXEC (@variable)(也称为动态SQL)在运行时解析列名.这是必需的,因为我们在编译时不知道列名.Vel*_*NOV 20
像 BigQuery 这样的现代 SQL 方言提出了一个很好的解决方案
SELECT * EXCEPT(ColumnNameX, [ColumnNameY, ...])
这是一种非常强大的 SQL 语法,可以避免由于表列名更改而需要一直更新的一长列列。而这个功能在目前的 SQL Server 实现中是缺失的,很可惜。希望有一天,Microsoft Azure 对数据科学家更加友好。
数据科学家喜欢能够有一个快速选项来缩短查询并能够删除一些列(由于重复或任何其他原因)。
https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select-modifiers
MrT*_*lly 17
就像其他人说过没有办法做到这一点,但是如果你使用的是Sql Server,我使用的一个技巧是将输出改为逗号分隔,然后再做
select top 1 * from table
Run Code Online (Sandbox Code Playgroud)
并从输出窗口中剪切整个列列表.然后,您可以选择所需的列,而无需全部输入.
没有办法做到这一点.也许你可以创建自定义视图,如果这在你的情况下是可行的
编辑可能是你的数据库支持动态sql的执行你可以写一个SP并传递你不想看到它的列,让它动态创建查询并将结果返回给你.我认为这至少在SQL Server中是可行的
小智 7
如果您使用的是SQL Server Management Studio,请执行以下操作:
请享用.
小智 7
例如,如果你想排除一个敏感的大小写列,比如密码,我这样做是为了隐藏值:
SELECT * , "" as password FROM tableName;
总而言之,你不能这样做,但我不同意上面的所有评论,在那些"有"场景你可以合法地使用*当你创建一个嵌套查询,以便从整个列表中选择一个特定的范围(如分页)当你在内部选择语句中时,为什么世界上想要指定外部select语句中的每一列?
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)
Run Code Online (Sandbox Code Playgroud)
更新:
如果更频繁地使用它,您还可以创建存储过程来处理此任务.在这个例子中,我使用了SQL Server 2016+上提供的内置STRING_SPLIT(),但是如果需要,还有很多关于如何在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
Run Code Online (Sandbox Code Playgroud)
然后就是:
EXEC [usp_select_without]
@table_name = N'Test_Table',
@list_of_columns_excluded = N'ID, Date, Name';
Run Code Online (Sandbox Code Playgroud)
我不知道有任何支持此功能的数据库(SQL Server、MySQL、Oracle、PostgreSQL)。它绝对不是 SQL 标准的一部分,所以我认为你必须只指定你想要的列。
您当然可以动态构建 SQL 语句并让服务器执行它。但这开启了 SQL 注入的可能性。
有没有办法在不指定所有列的情况下从表中排除列?
以通常的方式使用声明性SQL,没有.
我认为你提出的语法是值得的.实际上,关系数据库语言"Tutorial D"具有非常相似的语法,其中关键字ALL BUT后跟一组属性(列).
但是,SQL SELECT *已经受到了很多抨击(@ Guffa的回答是典型的反对意见),所以我认为SELECT ALL BUT不会很快进入SQL标准.
我认为最好的"解决方法"是创建一个VIEW只有你想要的列SELECT * FROM ThatView.
小智 5
如果我们谈论过程,它可以使用这个技巧生成一个新查询并执行它立即执行:
SELECT LISTAGG((column_name), ', ') WITHIN GROUP (ORDER BY column_id)
INTO var_list_of_columns
FROM ALL_TAB_COLUMNS
WHERE table_name = 'PUT_HERE_YOUR_TABLE'
AND column_name NOT IN ('dont_want_this_column','neither_this_one','etc_column');
Run Code Online (Sandbox Code Playgroud)
Postgres sql 有办法做到这一点
请参考:http : //www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html
信息模式黑客方法
SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name
FROM information_schema.columns As c
WHERE table_name = 'officepark'
AND c.column_name NOT IN('officeparkid', 'contractor')
), ',') || ' FROM officepark As o' As sqlstmt
Run Code Online (Sandbox Code Playgroud)
以上是我的特定示例表 - 生成一个看起来像这样的 sql 语句
SELECT o.officepark,o.owner,o.squarefootage FROM officepark As o
解决此问题的最佳方法是使用视图,您可以创建具有所需列的视图并从中检索数据
example
mysql> SELECT * FROM calls;
+----+------------+---------+
| id | date | user_id |
+----+------------+---------+
| 1 | 2016-06-22 | 1 |
| 2 | 2016-06-22 | NULL |
| 3 | 2016-06-22 | NULL |
| 4 | 2016-06-23 | 2 |
| 5 | 2016-06-23 | 1 |
| 6 | 2016-06-23 | 1 |
| 7 | 2016-06-23 | NULL |
+----+------------+---------+
7 rows in set (0.06 sec)
mysql> CREATE VIEW C_VIEW AS
-> SELECT id,date from calls;
Query OK, 0 rows affected (0.20 sec)
mysql> select * from C_VIEW;
+----+------------+
| id | date |
+----+------------+
| 1 | 2016-06-22 |
| 2 | 2016-06-22 |
| 3 | 2016-06-22 |
| 4 | 2016-06-23 |
| 5 | 2016-06-23 |
| 6 | 2016-06-23 |
| 7 | 2016-06-23 |
+----+------------+
7 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
721513 次 |
| 最近记录: |