如何选择表格中除一列以外的所有列?
Posted
技术标签:
【中文标题】如何选择表格中除一列以外的所有列?【英文标题】:How to select all the columns of a table except one column? 【发布时间】:2015-03-17 09:18:18 【问题描述】:我有将近 259 列我不能在 SELECT
语句中提及 258 列。
还有其他方法吗?
【问题讨论】:
您使用的是哪个 DBMS? 您已经有了一个包含 259 列的表。为什么要在意少选一个?你已经做了一个数据库的怪物和一个结果集的怪物,一列不会有什么不同。 不,这是不可能的。您必须列出每一列(或编写一个为您执行此操作的函数)。但是许多 SQL 客户端可以帮助您通过自动完成自动“生成”该列表。另外,您使用的是哪个 DBMS?后格雷斯?甲骨文? @GiriPrasad 在 Management Studio 中,您可以右键单击表格,选择Script table as
-> Select to
-> New query window
。这将生成一个包含所有列的选择,您可以删除不需要的列。
SQL exclude a column using SELECT * [except columnA] FROM tableA? 的可能重复项
【参考方案1】:
您可以使用这种方法从除一列之外的所有列中获取数据:-
-
将所有数据插入到临时表中
然后从临时表中删除不需要的列
从临时表中获取数据(这不会包含被移除列的数据)
删除临时表
类似这样的:
SELECT * INTO #TemporaryTable FROM YourTableName
ALTER TABLE #TemporaryTable DROP COLUMN Columnwhichyouwanttoremove
SELECT * FROM #TemporaryTable
DROP TABLE #TemporaryTable
【讨论】:
你怎么知道 Giri 正在使用哪个 DBMS? @a_horse_with_no_name:- 我不知道这就是为什么我说它只是一种方法! 感谢您的回复。似乎是一个有用的解决方案 我必须承认,这是一个新颖的解决方案。但是,每次需要执行查询时,这会给繁忙的服务器带来相当大的负载。而这一切都是因为一位数据库开发人员受到了懒惰的攻击。 “我确实不能在 select 语句中提到 258 列”! 事实上,再想一想,我想我会与任何执行此类代码的程序员坐下来很长时间。当然,我还想与设计此类表格的人进行长时间的讨论,然后再与请求此类查询的分析师进行一次长时间的讨论。人,头会滚动!【参考方案2】:创建一个视图。是的,在视图创建语句中,您必须列出每个...和...每个...字段...按...名称。
一次。
然后就是select * from viewname
。
【讨论】:
【参考方案3】:这不是通用解决方案,但某些数据库允许您使用正则表达式来指定列。
例如,在 Hive 的情况下,以下查询选择除 ds 和 hr 之外的所有列:
SELECT `(ds|hr)?+.+` FROM sales
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select#LanguageManualSelect-REGEXColumnSpecification
【讨论】:
我是一个认真的hive
开发人员,但我不知道这一点 - 很酷。
这个正则表达式有缺陷。如果要排除 day
和 day_hour
两列,(day|day_hour)?+.+
仍将匹配 day_hour
列。那是因为正则表达式引擎渴望|
。虽然将顺序更改为(day_hour|day)?+.+
可以解决此问题,但更好的方法是使用负前瞻,(?!(day|day_hour)$).+
。
我正在使用 Hive,但不知何故它给了我一个错误,说 Invalid table alias or column reference
。似乎它正在读取“(colname)?+。+”作为文字列名。有什么解决办法吗?谢谢。【参考方案4】:
您可以从 sys.columns 表中获取列名详细信息
尝试以下查询:
SELECT * FROM SYS.COLUMNS
WHERE object_id = OBJECT_ID('dbo.TableName')
AND [Name] <> 'ColumnName'
DECLARE @sql as VARCHAR(8000)
SET @sql = 'SELECT '
SELECT @sql += [Name] + ', ' FROM SYS.COLUMNS
WHERE object_id = OBJECT_ID('dbo.TableName')
AND [Name] <> 'ColumnName'
SELECT @sql += ' FROM Dbo.TableName'
EXEC(@sql)
【讨论】:
【参考方案5】:有很多可用的选项,其中之一是:
CREATE TEMPORARY TABLE temp_tb SELECT * FROM orig_tb;
ALTER TABLE temp_tb DROP col_x;
SELECT * FROM temp_tb;
这里 col_x 是您不想包含在 select 语句中的列。
看看这个问题:Select all columns except one in mysql?
【讨论】:
感谢您的回复【参考方案6】:我只是想回应@Luann 的评论,因为我一直使用这种方法。
只需右键单击表格 > 将表格编写为 > 选择到 > 新建查询窗口。
您将看到选择查询。只需取出您要排除的列,您就有了首选的选择查询。
【讨论】:
我也得到了简单的解决方案 - 更简单的是使用“选择前 1000 行”。 :)【参考方案7】:如果您使用DataGrip,您可以执行以下操作:
-
输入您的 SELECT 语句
SELECT * FROM <your_table>;
将光标放在*
上,然后按Alt+Enter
您将获得带有Expand column list
选项的弹出菜单
点击它,它会将*
转换为完整的列列表
现在您可以删除不需要的列
Here is a link for an example on how to do it.
【讨论】:
这是一个很好的解决方案【参考方案8】:您可以通过简单查询来检索列名列表,然后通过 apply where 查询删除这些列。
SELECT * FROM (
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'TableName'
) AS allColumns
WHERE allColumns.COLUMN_NAME NOT IN ('unwantedCol1', 'unwantedCol2')
【讨论】:
可以用一个where子句来完成,不需要从select中选择【参考方案9】:无需创建新表,您可以简单地做(例如使用 mysqli):
-
获取所有列
遍历所有列并删除您想要的内容
提出您的问题
$r = mysqli_query('SELECT column_name FROM information_schema.columns WHERE table_name = table_to_query');
$c = count($r); while($c--) if($r[$c]['column_name'] != 'column_to_remove_from_query') $a[] = $r[$c]['column_name']; else unset($r[$c]);
$r = mysqli_query('SELECT ' . implode(',', $a) . ' FROM table_to_query');
【讨论】:
【参考方案10】:尝试以下查询:
DECLARE @Temp NVARCHAR(MAX);
DECLARE @SQL NVARCHAR(MAX);
SET @Temp = '';
SELECT @Temp = @Temp + COLUMN_NAME + ', ' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='Person' AND COLUMN_NAME NOT IN ('Id')
SET @SQL = 'SELECT ' + SUBSTRING(@Temp, 0, LEN(@Temp)) +' FROM [Person]';
EXECUTE SP_EXECUTESQL @SQL;
【讨论】:
【参考方案11】:在您的情况下,在对象资源管理器中展开该数据库的列。将列拖入查询区域。
然后只需删除一两列您不想要的列,然后运行它。我愿意接受任何比这更容易的建议。
【讨论】:
【参考方案12】:只有一种方法可以实现这个给定的列名。没有找到其他方法。您必须列出所有列名
【讨论】:
虽然您所说的可能是一般情况,但有多个答案描述了可以实现预期结果的[角落]案例。以上是关于如何选择表格中除一列以外的所有列?的主要内容,如果未能解决你的问题,请参考以下文章
如何从python中的数组(或矩阵)中提取除一列之外的所有列?
在EXCEL中用VBA操作WORD表格:怎样选择一个表格中除第一行以外的任意连续行(比如第2到4行)?