如何使用mysql在单个case语句中获得所有有效的when子句?

dy1byipe  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(318)

在我的数据库中,我有3个单独的数据库表来存储地址信息。数据库表告诉地址源。请不要要求我重做数据库设计,因为它真的不由我决定;另一个小组负责。
总之,我使用case-when语句尝试将来自所有3个源的单个位置的地址结果合并到一个列表中(就像是从一张table上拉出来的一样)。

SELECT
    loc.ID,
    CASE 
         WHEN addr1.ID IS NOT NULL THEN addr1.ADDRESS 
         WHEN addr2.ID IS NOT NULL THEN addr2.ADDRESS 
         WHEN addr3.ID IS NOT NULL THEN addr3.ADDRESS 
    END as LOC_ADDRESS
FROM LOCATION loc
LEFT JOIN ADDRESS_1 addr1 ON loc.ID = addr1.LOCATION_ID
LEFT JOIN ADDRESS_2 addr2 ON loc.ID = addr2.LOCATION_ID
LEFT JOIN ADDRESS_3 addr3 ON loc.ID = addr3.LOCATION_ID;

我使用左连接是因为一个位置在任何/所有这些源中都有一个地址是可选的。e、 g.1位置可能有一个地址(或多个),而另一个位置可能根本没有任何地址。
我所期望的是,如果一个位置在源1和源3中有一个地址,那么这两个地址都会被返回。然而,似乎只有第一个条件在返回时才有效。
如何返回所有有效条件?
基于注解编辑:我希望它返回匹配的地址列表。e、 g.addr1有效,addr3有效,则应与第1行的loc.id,addr1.address和第2行的loc.id,addr3.address相似。等。

gg58donl

gg58donl1#

因为你想要所有的3个地址,如果存在的话 concat 功能可以帮助你

SELECT
        loc.ID,
       concat( concat(addr1.ADDRESS,
              addr2.ADDRESS), 
             addr3.ADDRESS )
        as LOC_ADDRESS
    FROM LOCATION loc
    LEFT JOIN ADDRESS_1 addr1 ON loc.ID = addr1.LOCATION_ID
    LEFT JOIN ADDRESS_2 addr2 ON loc.ID = addr2.LOCATION_ID
    LEFT JOIN ADDRESS_3 addr3 ON loc.ID = addr3.LOCATION_ID;
zfciruhq

zfciruhq2#

根据op的评论,你需要 Inner Join 与各种地址表分开使用 UNION ALL .
请尝试以下操作:

SELECT
    loc.ID,
    addr1.ID AS LOC_ADDRESS
FROM LOCATION loc
JOIN ADDRESS_1 addr1 ON loc.ID = addr1.LOCATION_ID 

UNION ALL 

SELECT
    loc.ID,
    addr2.ID AS LOC_ADDRESS
FROM LOCATION loc
JOIN ADDRESS_2 addr2 ON loc.ID = addr2.LOCATION_ID 

UNION ALL 

SELECT
    loc.ID,
    addr3.ID AS LOC_ADDRESS
FROM LOCATION loc
JOIN ADDRESS_2 addr3 ON loc.ID = addr3.LOCATION_ID

相关问题