• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

MySQL加入从一系列条件中只选择了1个条件

mysql 来源:Todd 3次浏览

我有一个客户表和一个存储客户地址的单独表。它们通常在地址表中至少有两个连接记录,如果不是更多。当我想要一个邮件列表时,我需要客户的帐单地址,在地址表中用’type’列标记。不幸的是,并非每个客户都有一个标有’结算’的地址。我怎么能写一个陈述来选择标记账单的地址,除非没有一个,在这种情况下选择另一个。我不想只用’或’,因为我只想要选择一个记录。MySQL加入从一系列条件中只选择了1个条件

为了简便起见,表看起来是这样的:

客户:
ID

地址:
ID
客户ID
型(发货,开票, ”,等)

下面是一些SQL是不是我想要的(笑): 从客户选择*内部联接地址上address.custid = Customer.id其中Address.type =“结算”

!!后加! !
Kevin提供了我非常喜欢的coalesce解决方案,但它仅适用于地址表中的单个列。我需要从表格中的所有字段/列形成一个可用的地址。

我一直在试图做到这一点,像这样(只使用两个字段这里简单):
select coalesce(concat_ws(',',a1.address, a1.city), concat_ws(',',a2.address, a2.city), concat_ws(',',a3.address, a3.city)) from customer c ...
然而,CONCAT_WS打破总是返回非空的聚结。
我也尝试只是在做每场独立凝聚:
coalesce(a1.address, a2.address), coalesce(a1.address2, a2.address2), etc
但这的地址来自3条不同的记录,例如,如果地址2(用于房间号或其他)“混淆”效果空了一排,然后它会在那里插入一条不同的记录地址2。

有谁知道如何防止concat_ws返回非null,即使字段为空内?

===========解决方案如下:

如果存在的话这将让你的账单地址,否则送货地址:

select ifnull(a1.address, a2.address) from customer c 
left join address a1 on c.id = a1.custid and a1.type = 'billing' 
left join address a2 on c.id = a2.custid and a2.type = 'shipping' 

,如果你想检查是否有其他类型,可以添加连接和使用,而不是IFNULL聚结,像这样:

select coalesce(a1.address, a2.address, a3.address) from customer c 
left join address a1 on c.id = a1.custid and a1.type = 'billing' 
left join address a2 on c.id = a2.custid and a2.type = 'shipping' 
left join address a3 on c.id = a3.custid and a3.type = 'X' 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)