psql:SELECT *…除了一列


10

我寻找一种简单的方法来选择除psql中的所有列以外的所有列。

随着psql我的意思是交互式命令行。

我对扩展*到带引号的列名列表的工具感到满意。然后,我可以删除专栏以手动删除。

我的问题只是关于psql的交互用法。这与那些对sql标准不满意的人以及想要执行“ select * -foo”之类的问题的问题不是重复的。


3
没有一个,对不起。您可以information_schema通过pl / pgsql函数查询以非常容易地生成列表,但是那样的话,它将是两次查询。
Craig Ringer 2015年

2
大多数GUI工具都可以做到这一点。但是,如果您想(或必须)坚持使用命令行,也许这会有所帮助:github.com/dbcli/pgcli
a_horse_with_no_name 2015年

@a_horse_with_no_name我想接受您的“答案”。您能否发布答案并解释pgcli工具解决问题的用法。
guettli

除了哪一列?最后一个?第一个?还是随机的?
BAE

1
@ChengchengPei:没有desc命令psql
a_horse_with_no_name

Answers:


4

要以默认顺序获取列列表,而没有坏列:

SELECT string_agg(quote_ident(attname), ', ' ORDER BY attnum)
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytable'::regclass
AND    NOT attisdropped  -- no dropped (dead) columns
AND    attnum > 0        -- no system columns
AND    attname <> 'bad_column'  -- case sensitive!

或者只是WHERE attrelid = 'mytable'::regclass您信任搜索路径即可解析为正确的架构。

quote_ident() 在必要时添加双引号。

在2007年在pgsql-general上问了同样的问题。那时是Postgres 8.2。甜蜜的回忆 ...

有关:


1
听起来像一个待办事项,向psql添加反斜杠命令,该命令将发出一个字符串,该字符串是表中所有列的列表,并用适当的引号引起来。而且您可以忽略掉作为命令额外参数包含的任何列。因此假设\dq thetable bad_column
jjanes

@jjanes:我不确定它是否会产生足够的需求以说服核心开发人员q为任务分配免费信件。也许是整个\d命令族的一个通用选项,以显示级联名称的裸列表?像\d- tbl(助记符:的反面\d+,显示更多详细信息)。这基本上可以获取任何裸露的对象列表。架构中的表格:\dt- public.*,以“ f_foo”开头的函数:\df- f_foo*等-或表格中的列:\d- mytbl。类似于shell命令的ls功能...
Erwin Brandstetter

我给你赏金。但是psql内置的功能确实是一个不错的功能。谢谢你欧文:-)
guettli 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.