2011-02-28 91 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

相关问题