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

我有一个客户表和一个存储客户地址的单独表。它们通常在地址表中至少有两个连接记录,如果不是更多。当我想要一个邮件列表时,我需要客户的帐单地址,在地址表中用'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'

回答:

select c.id, a.id 

from customer c join address a on a.custid = c.id

where a.type = 'Billing'

union

select c.id, a.id

from customer c join address a on a.custid = c.id

where a.type <> 'Billing'

and c.id not in (select custid from address a where a.type = 'Billing')

这是一种方法。

回答:

没有OR子句就很难做到这一点。假设你正在寻找的地址ID:

SELECT 

Address.id

FROM Address LEFT JOIN Customer ON Customer.id = Address.custid

WHERE Address.id EXIST (

SELECT

Address.id

FROM Address LEFT JOIN Customer ON Customer.id = Address.custid

WHERE Address.type LIKE 'shipping'

) OR Address.type = 'billing'

回答:

select ... 

from customer c join address a on a.custid = c.id

where a.type = 'Shipping'

union all

select ...

from customer c join address a on a.custid = c.id

where a.type = 'Billing' and not exists (

select 1 from address a2

where a2.custid = a.custid and a2.type = 'Shipping'

)

如果你需要一点点更通用的牛逼母鸡,你可能会发现这个“黑客”有用:

select * from address 

where id in (

select

min(case type

when 'Shipping' then 100000000

when 'Billing' then 200000000

when ... then 300000000

else 900000000

end + a.id) % 100000000 /* not sure of MySQL for modulo operation */

from address a

group by custid

)

以上是 MySQL加入从一系列条件中只选择了1个条件 的全部内容, 来源链接: utcz.com/qa/262181.html

回到顶部