我有一個客戶表和一個存儲客戶地址的單獨表。它們通常在地址表中至少有兩個連接記錄,如果不是更多。當我想要一個郵件列表時,我需要客戶的帳單地址,在地址表中用'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,即使字段爲空內?
再加一個包含''''類型的條件? –
列出的每個答案都很棒,但我認爲這是我最喜歡的答案,主要是由於沒有使用聯盟(我也沒有想到)。我從來沒有見過coalesce功能。我會試試看,如果有效,我會回來給你檢查。非常感謝每個人爲您的出色投入 - Kevin,VKP,shawnt00,Ben Kulka。 – Todd
@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。 – Todd