SQL检查一个列是否是另一个列的子字符串

13
我正在尝试检查一个列的子字符串是否在另一个列中。
FullName              
Johns Doue               
Johnny                   
Betty Smith, Chair     

表格2

Name       
John

使用table2查看它是否是table1的子字符串。它应该返回Johns Doue和Johnny。

SELECT * FROM table1.FullName AS table1      
JOIN table2.Name AS table2    
WHERE table2.Name LIKE SUBSTRING(table1.FullName, 0, 10);

这里返回的是空值进行比较。我不确定错在哪里。从我的逻辑来看,似乎它正在从table2.name获取结果,并与table1.FullName的子字符串进行比较。

3个回答

17

您需要在LIKE模式中使用通配符来查找子字符串。同时,在SELECT语法中,您似乎混淆了表名和列名。

SELECT *
FROM table1 AS t1
JOIN table2 AS t2
WHERE t1.FullName LIKE CONCAT('%', t2.Name, '%')

您还可以使用LOCATE而不是LIKE

SELECT *
FROM table1 AS t1
JOIN table2 AS t2
WHERE LOCATE(t2.Name, t1.FullName) > 0

演示


我已经执行了第一个查询,但是 t2.name 的结果为 null。 - user2113896
我添加了一个演示,展示了使用你的样本数据,两个查询都可以正常工作。 - Barmar

4

这里有一个使用joinlike以及concat的选项:

select * 
from table1 as t1
    join table2 as t2 on t1.FullName like concat('%',t2.name,'%')

如果你只想要以这个名字开头的全名,那么就删除第一个'%'


我已经做了那个,但它仍然给我一个空字符串的结果,与另一个空字符串进行比较。 - user2113896
fullname字段中有值,但是它与t2表中的name字段进行比较时,t2表中的name字段为空。 - user2113896
@user2113896 -- 我猜这里的意思是只需添加where条件来消除空值吧?http://sqlfiddle.com/#!9/290973/2 - sgeddes
是的,我添加了一个语句来检查它是否为空,但是没有起作用。 - user2113896
@user2113896 -- 在这个时候,您需要澄清您的问题... 您是否尝试了可工作的fiddle?您能否在其中复制您遇到的问题并重新发布链接以使其正确工作? - sgeddes
实际上,是的,它起作用了。我不知道为什么以前不行。但非常感谢你!! - user2113896

0

LOCATE 在某些 SQL 方言中不可用(例如 Postgres),而显然使用字符串连接来构建 SQL 查询是被反对的(来源:TypeError: 'dict' object does not support indexing)。

你可以使用 POSITION 命令作为替代:

SELECT *
FROM table1 AS t1
JOIN table2 AS t2
WHERE POSITION(t2.Name IN t1.FullName) > 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接