gpt4 book ai didi

postgresql - 使用 CASE 选择不同 - PostgreSQL

转载 作者:行者123 更新时间:2023-11-29 13:02:08 24 4
gpt4 key购买 nike

我正在尝试从不同的表中选择地点信息:我在一张表中有地点,在另一张表中有地理坐标,在另一张表中有电话和电子邮件。问题是我们可能有也可能没有电子邮件和电话。我正在寻找一种方法来获取存在的电子邮件/电话,如果不知道它们则为空白值。所以我在 SELECT 上使用了“CASE”指令。

如果我们没有电子邮件也没有电话,一切正常:我们只返回一条线路。

但是如果我们有电子邮件或电话,它会返回 2 行;最坏的情况是我们同时拥有电子邮件和电话:在这种情况下,它会为每个地方返回三行:

  1. 地名,空白电话,空白邮件
  2. 地名,空白电话,填充邮件
  3. 地名,填充的电话,空白邮件

我正在寻找一种只获得一行的方法:

0)地名+填充(或不填充)电话+填充(或不填充)邮件

我试过 'distinct' 但它不起作用 :(

这是我的查询:

select distinct
places.name as place,

CASE place_properties.pkey WHEN 'gen.telephone'
THEN place_properties.pvalue
END
as telephone,

CASE place_properties.pkey WHEN 'gen.email'
THEN place_properties.pvalue
END
as email
from
places
inner join
place_properties on place_properties.place_id = places.id

这是一个简化的答案示例:

"ALLIAT"                ;"0561059858"   ;""
"ALLIAT" ;"" ;"contact@leslonguespistes.com"
"ALLIAT" ;"" ;""
"TARASCON SUR ARIEGE" ;"0561023281" ;""
"TARASCON SUR ARIEGE" ;"" ;"hotel@manoiragnes.com"
"TARASCON SUR ARIEGE" ;"" ;""
"Les Cabanes" ;"" ;""

我们看到“ALLIAT”和“Tarascon”被返回了三次,因为它同时具有电话号码和电子邮件地址,而“Les cabanes”仅被返回一次,因为它没有任何一个。

当我们在数据库中保存电子邮件和/或电话时,如何将 SQL 更改为只有一行?

最佳答案

试试这个:

SELECT
places.name AS place
, pp.telephone
, pp.email
FROM places
LEFT JOIN (
SELECT
place_id
, MAX(CASE place_properties.pkey WHEN 'gen.telephone' THEN place_properties.pvalue END) AS telephone
, MAX(CASE place_properties.pkey WHEN 'gen.email' THEN place_properties.pvalue END) AS email
FROM place_properties
WHERE place_properties.pkey IN ('gen.telephone', 'gen.email')
GROUP BY
place_id
) AS pp
ON places.id = pp.place_id

也许可以使用这种方法的替代方法,但为此我建议我们需要一组好的样本数据。


不清楚您是否只想要有电子邮件电话的地点,因此我使用了 LEFT JOIN 允许列出所有地点。如果您只想要那些带有(电话或电子邮件)的地方,请改用 INNER JOIN

关于postgresql - 使用 CASE 选择不同 - PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26526317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com