我有一个查询,它会像这样动态地创建一个列:
SELECT
v_list_client.id AS "id",
EXISTS(
SELECT id FROM message
WHERE to_phone_number = v_list_client."phoneNumber"
AND created_by_agent_id !=
(SELECT id FROM agent WHERE agent_role_id = (
SELECT id FROM agent_role WHERE label = 'Bot'))
) AS "hasReceivedMessageFromAgent",
*
FROM v_list_client
LEFT JOIN v_form
ON (v_form."client" ->> 'id')::integer = id
WHERE (v_form."formTypeId")::integer = 1
AND (v_form."isReceived")::boolean = true
HAVING "hasReceivedMessageFromAgent" = true
我希望HAVING
子句只在客户端收到来自代理的消息时返回结果。即hasReceivedMessageFromAgent
列为true
。
1条答案
按热度按时间r7knjye21#
HAVING
仅适用于GROUP BY
之后。但是也不能在WHERE
子句中引用输出列。(这就是你在错误的树。)参见:从结果中删除
"hasReceivedMessageFromAgent"
列。根据定义,它将始终是真的,因此是噪声。您确实希望在另一个WHERE
子句中使用表达式作为筛选器。我怀疑你的问题更多。特别是
agent
上的子查询看起来可能会返回多行,这将引发异常。参见:考虑这个重写:
关于假
LEFT JOIN
,见:"formTypeId"
应该已经是integer
。"isReceived"
应该已经是boolean
。两者的演员阵容都是昂贵的废话。如果值始终有效,则列应已具有正确的数据类型。如果不是这样的话,那就失败了。
旁白:如果可能的话,在Postgres中使用法律的的、小写的、未加引号的标识符。参见: