我的数据库包含具有这些字段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语句创建。
答案 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 * ...
,因为这可能会导致性能下降