SELECT * EXCEPT
SELECT * EXCEPT
有没有任何 RDBMS 实现类似 SELECT * EXCEPT
的功能?我想要的是获取除了特定的 TEXT/BLOB 字段之外的所有字段,并且我希望能够选择其他所有内容。
几乎每天我都向我的同事抱怨,有人应该实现这个功能...很烦人它不存在。
编辑:我理解大家对于 SELECT *
的担忧。我知道与 SELECT *
相关的风险。然而,在我的情况下,这不会被用于任何生产级别的代码,甚至开发级别的代码;仅用于调试时,当我需要轻松查看所有值时。
正如我在一些评论中所述,我们所在的工作地点严格是一个命令行操作环境,所有操作都通过 ssh 进行。这使得使用任何 GUI 工具(不允许与数据库进行外部连接)等变得困难。
谢谢大家的建议。
SELECT * EXCEPT 是一个用于在查询结果中排除指定列的语句。该功能在不同的关系型数据库管理系统中具有不同的实现方式。
首先,Google BigQuery 实现了 SELECT * EXCEPT。通过在查询语句中使用 SELECT * EXCEPT (column_name) 的语法,可以排除指定的列。被匹配到的列将从输出结果中省略。
例如,在以下查询中,从 orders 表中排除了 order_id 列:
WITH orders AS( SELECT 5 as order_id, "sprocket" as item_name, 200 as quantity ) SELECT * EXCEPT (order_id) FROM orders;
输出结果为:
+-----------+----------+ | item_name | quantity | +-----------+----------+ | sprocket | 200 | +-----------+----------+
除了 Google BigQuery,H2 数据库也支持 SELECT * EXCEPT (col1, col2, ...) 的语法。通过这种方式,可以在查询中排除指定的列。
此外,Hive 也支持使用正则表达式来选择列,以排除指定的列。在 Hive 0.13.0 之前的版本中,或者在 0.13.0 及以后的版本中,当配置属性 hive.support.quoted.identifiers 设置为 none 时,可以在 SELECT 语句中使用基于正则表达式的列选择。下面的查询示例排除了 ds 和 hr 列:
SELECT `(ds|hr)?+.+` FROM sales
Snowflake 也在其最新版本中支持 SELECT * EXCEPT。通过使用 EXCLUDE col_name EXCLUDE (col_name, col_name, ...) 的语法,可以指定在选择所有列(SELECT *)时从结果中排除的列。此外,Snowflake 还提供了一个 RENAME 选项,用于在选择所有列时指定列的别名。
Databricks SQL(自 Runtime 11.0 起)和 DuckDB 也支持 SELECT * EXCEPT 的功能。
SELECT * EXCEPT 是一个用于在查询结果中排除指定列的功能。它的实现方式因不同的关系型数据库管理系统而异,但在许多主流的数据库系统中都可以找到相应的实现方法。
(SELECT * EXCEPT)问题的出现的原因是如果在查询中使用SELECT *,它将返回表中的所有列,包括blob列。然而,blob列可能包含大量的数据,如果在查询中不需要这些列,会浪费时间和资源来传输和处理这些数据,同时也会增加查询的复杂性。
为了解决这个问题,可以创建一个视图(view)来代替直接查询表。视图是一个虚拟的表,它只包含表中的特定列,可以根据需要进行定义和修改。创建视图时,可以选择不包括blob列,这样在查询时就不会返回这些列的数据。
使用视图的好处是可以简化查询语句,不需要每次都输入需要的列名,只需要使用视图的名称即可。这对于开发人员在调试时非常方便。另外,如果源表发生变化,只需要修改视图的定义即可,不需要修改每个查询语句。
对于那些不希望保留查询语句的情况,可以使用剪切和粘贴操作,将查询语句保存到文本文件中,需要时再进行复制粘贴。这样可以减少桌面上的杂乱文件,并且相对于打开文件、复制和粘贴的操作来说,执行一个简单的SELECT语句更加方便快捷。
为了避免(SELECT * EXCEPT)问题的出现,可以通过创建视图来选择性地排除blob列,从而简化查询语句并避免不必要的数据传输和处理。同时,可以选择将查询语句保存到文本文件中,以便需要时进行复制粘贴操作。这样既可以提高查询的效率,又可以减少桌面上的杂乱文件。
(SELECT * EXCEPT)这个问题的出现的原因是有用户想要在查询中排除某一列,但是这种做法容易在将来当有人更改表结构时出现问题。然而,通过使用动态SQL,可以实现这个目标。以下是一种使用动态SQL实现排除某一列的方法:
首先,声明一个变量来保存最终的查询语句,然后获取表的ID和第一个不需要排除的列的ID。接下来,使用一个循环,在每次循环中获取下一个不需要排除的列的ID,并将其添加到查询语句中。最后,执行查询语句。
以下是示例代码:
declare @sql varchar(8000), @table_id int, @column_id int set @sql = 'select ' select @table_id = id from sysobjects where name = 'MY_Table' select @column_id = min(colid) from syscolumns where id = @table_id and name <> 'description' while (@column_id is not null) begin select @sql = @sql + name from syscolumns where id = @table_id and colid = @column_id select @column_id = min(colid) from syscolumns where id = @table_id and colid > @column_id and name <> 'description' if (@column_id is not null) set @sql = @sql + ',' print @sql end set @sql = @sql + ' from MY_table' exec(@sql)
使用动态SQL的一个常见问题是语法错误,通常是由于引号的不平衡导致的。在动态SQL中,容易因为引号使用不正确而出现混淆。
在回答实际问题的同时,还有几个原因可以解释为什么可能需要这样做,而不是因为疯狂。其一是创建一个视图,如果底层表的列发生更改,视图也会相应地改变,并且可以在其他选择语句中使用。其二是在编写触发器时,如果表的任何列发生更改,除了某一列之外,触发器会触发。这样可以实现所有其他列的"动态"效果,而不需要为每个表结构变化更改触发器函数。
使用动态SQL可以解决在查询中排除某一列的问题。然而,需要注意动态SQL可能带来的语法错误和代码长度的问题。