避免在select语句中重复列

时间:2018-07-02 10:20:18

标签: sql postgresql

我的数据库包含具有这些字段person的表username, name, online, visible, ...

我有以下查询来获取此人

SELECT *,
    CASE
        WHEN online = 0 THEN 0
        WHEN visible = 0 THEN 0
        ELSE online
    END AS online
FROM person
where id = SOMEID

我正在尝试将与用户设置的可见性逻辑相关的在线/离线移入查询。基本上根据可见性状态显示在线状态(如果用户选择了不可见,则即使用户在线也要离线显示)。

这类作品,但存在问题。在此查询的结果中,我得到了两个重复的列。

username | name | online | visible | ... | online
x        | x    | x      | x       | ... | x

出于无法控制的原因,我坚持使用SELECT *,而不是手动在列中输入SELECT username, name, visible, ...。是否可以从online中排除SELECT *字段?因为它将稍后由CASE语句创建。

2 个答案:

答案 0 :(得分:2)

不幸的是,*表示所有列,无法从选择*中排除特定的列。也许您可以将列命名为“ online_status”,然后在代码中使用“ online_status”,而不是“ online”列。

答案 1 :(得分:0)

Postgres和SQL都不存在这种功能。我认为这是一个非常有趣的问题,因此我在Google上做了一些搜索,并在postgresonline.com上看到了一篇有趣的文章。

它们显示了一种直接从模式中选择列的方法:

  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

您可以创建一个执行类似操作的函数。在邮件列表中也讨论了这些主题,但是总体共识几乎相同:查询架构。

我确定还有其他解决方案,但我认为它们都将涉及某种魔术模式-queriying-foo。

顺便说一句:请谨慎使用SELECT * ...,因为这可能会导致性能下降