2011-02-28 56 views
0

假設我有兩個表,每個表都有一個字符串列(名稱)。我想做一個左外從T1加入到t2其中t1.name喜歡%t2.name%或t2.name類似%t1.name%你可以使用sql()函數進行表連接嗎?

是類似的東西可能嗎?

+0

但索引不會工作,如果你在搜索字符串的前面有'%' – 2011-02-28 11:36:35

+0

我實際上只是把%放在最後,但是謝謝你的信息。 – klochner 2011-02-28 11:45:53

+0

'LIKE'是一個謂詞,而不是一個函數。 – onedaywhen 2011-02-28 13:05:47

回答

3

幾乎任何去在where子句也可以去在on條款,如:

select * 
from t1 
left join 
     t2 
on  t1.name like '%' + t2.name + '%' 
     or t2.name like '%' + t1.name + '%' 
+0

真棒,謝謝 - 我無法選擇幾分鐘的答案。 – klochner 2011-02-28 11:40:26

+1

你得到了第二個像回到前面。應該是't2.name LIKE「%」 + t1.name +「%」' – dogbane 2011-02-28 11:51:23

+0

@dogbane:你說得對,在回答糾正 – Andomar 2011-02-28 13:27:12

2

肯定。你可以這樣說:

... where t1.name like '%' + t2.name + '%' 
+0

||有什麼作用這裏?你能否詳細說明。 – rdp 2011-02-28 11:42:54

+0

您可以使用管道(在Oracle等)到Concat的,如果你已經'設定的sql_mode =「PIPES_AS_CONCAT」;' – dogbane 2011-02-28 11:44:26

+0

我想找到任何條目,其中一個名字與另一個開始,例如 - 傑夫將加入與傑弗裏和傑弗裏會加入傑夫 - 我猜測它是(t1.name像t2.name +'%')或(t2.name像t1.name +'%')。 – klochner 2011-02-28 11:44:57

2

是。從上JOIN Syntax

MySQL的文檔與所使用的conditional_expr是可以在一個WHERE子句 使用的 形式的任何條件表達式。

1

正如Andomar指出的,on子句和where子句之間沒有太大差別。

然而,在使用like一個連接就可以在大多數情況下不好的習慣,因爲它可以(會)導致意外的結果。例如,如果兩個表中存在具有名稱A, Ab, AbcAbcd行,所產生的左連接將不會只是4個行,因爲它會基本上每行第一個表匹配的每個從第二個表,你會得到結果,而不是4.

+0

感謝 - 我參加其他欄目,並使用類似條件細化加盟。 – klochner 2011-02-28 12:03:31

+0

是的,'likes'可能會在數據不一致的情況下爲您節省時間,但請考慮是否存在可能導致重複結果的情況。 – SWeko 2011-02-28 12:10:15

+0

我明白你在做什麼,我正在使用rails,所以我可以在框架代碼中改進結果。 – klochner 2011-02-28 12:14:27

相關問題