当前位置:  开发笔记 > 编程语言 > 正文

SELECT*EXCEPT

如何解决《SELECT*EXCEPT》经验,为你挑选了5个好方法。

是否有任何RDBMS实现类似的东西SELECT * EXCEPT?我所追求的是获取除特定TEXT/BLOB字段之外的所有字段,我只想选择其他所有字段.

几乎每天我都会向我的同事抱怨有人应该实现这个......它非常烦人,它不存在.

编辑:我理解大家的关注SELECT *.我知道与之相关的风险SELECT *.但是,至少在我的情况下,这不会用于任何生产级代码,甚至是开发级代码; 严格用于调试,当我需要轻松查看所有值时.

正如我在一些评论中所说,我工作的地方严格来说是一个命令行商店,在ssh上做一切.这使得很难使用任何gui工具(不允许与数据库的外部连接)等.

谢谢你的建议.



1> Jasmine..:

正如其他人所说,在查询中执行此操作并不是一个好主意,因为当有人在将来更改表结构时,它很容易出现问题.但是,有一种方法可以做到这一点......我无法相信我实际上在暗示这一点,但本着回答实际问题的精神......

使用动态SQL执行此操作...这将执行除"description"列之外的所有列.您可以轻松将其转换为函数或存储过程.

declare @sql varchar(8000),
    @table_id int,
    @col_id int

set @sql = 'select '

select @table_id = id from sysobjects where name = 'MY_Table'

select @col_id = min(colid) from syscolumns where id = @table_id and name <> 'description'
while (@col_id is not null) begin
    select @sql = @sql + name from syscolumns where id = @table_id and colid = @col_id

    select @col_id = min(colid) from syscolumns where id = @table_id and colid > @col_id and name <> 'description'
    if (@col_id is not null) set @sql = @sql + ','
    print @sql
end

set @sql = @sql + ' from MY_table'

exec @sql


本着回答实际问题的精神,您赢得了奖项.
我实际上可以想到为什么你可能需要这样做而不是疯狂的几个原因.此外,这是一个有趣的问题,无论问题如何,弄清楚只是很有趣:)
首先,感谢您回答这个问题,而不是考虑该人是否应该做这件事.执行此操作的一个主要方案是创建一个视图,如果它们发生更改,您希望获取基础表列,并将在其他选择特定列的select语句中使用.

2> Paul Dixon..:

在表上创建一个不包含blob列的视图


我已经剪掉并粘贴在我新奇的计算机上.:-)
如果源表发生更改,则需要修改视图.如果您打算在其上使用SELECT*,也可以选择您真正想要开始的列.

3> billinkc..:

DB2允许这样做.列的属性/说明符为Hidden.

从syscolumns文档

HIDDEN
CHAR(1)NOT NULL WITH DEFAULT'N'
表示是否隐式隐藏了列:

P部分隐藏.SELECT*隐式隐藏该列.

N没有隐藏.该列对所有SQL语句都可见.

创建表文档作为创建列的一部分,您可以指定IMPLICITLY HIDDEN修饰符

来自示例DDL 隐式隐藏的列如下

CREATE TABLE T1
(C1 SMALLINT NOT NULL,
C2 CHAR(10) IMPLICITLY HIDDEN,
C3 TIMESTAMP)
IN DB.TS;

这种能力是否是推动DB2采用的交易制定者,这仍然是未来读者的一种练习.



4> Lukasz Szozd..:

是否有任何RDBMS实现SELECT*EXCEPT之类的东西?

是的,Google Big Query实现SELECT*EXCEPT:

SELECT*EXCEPT语句指定要从结果中排除的一个或多个列的名称.输出中省略了所有匹配的列名称.

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      |
+-----------+----------+



5> onedaywhen..:

是否有任何RDBMS实现SELECT*EXCEPT之类的东西

是! 真正的关系语言教程D允许以要删除的属性而不是要保留的属性来表示投影

my_relvar { ALL BUT description }

事实上,它相当于SQL的SELECT *{ ALL BUT }.

您对SQL的建议是值得的,但我听说它已被用户组提交给SQL标准委员会并被供应商组拒绝:(

它也已明确请求SQL Server,但请求已关闭,因为"将无法修复".

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有