SQL在列上加入LIKE另一列[重复]

Posted

技术标签:

【中文标题】SQL在列上加入LIKE另一列[重复]【英文标题】:SQL Join on a column LIKE another column [duplicate] 【发布时间】:2013-01-19 17:54:12 【问题描述】:

可能重复:mysql join query using like?

我想做一个连接,其中一列包含另一个表列中的字符串:

SELECT
a.first_name,
b.age
FROM names a
JOIN ages b
ON b.full_name LIKE '%a.first_name%'

这可能吗?我正在使用 MySQL。当然,上面的查询不会起作用,因为 LIKE '%a.first_name%' 只会查找字符串 a.first_name,而不是列的实际值。

【问题讨论】:

如果你在字符串的开头有一个 % ,它将无法使用你在那个 b.full_name 列上的任何索引。只是让你知道,如果你在这里有一个相当大的数据库,你的表现会很糟糕。 你会得到你想要的。所以如果名字是 Jo,你会得到 josephine、josiline、jobob、jody、joseph 等。 【参考方案1】:

你只需要连接字符串,你也可以做一个搜索和替换。

SELECT
    a.first_name,
    b.age
FROM names a
JOIN ages b
ON b.full_name LIKE '%' + a.first_name + '%'

【讨论】:

使用ON b.full_name LIKE CONCAT('%', a.first_name, '%')对我来说效果更好 此解决方案适用于 SQL Server,而非 MYSQL【参考方案2】:

您可以使用 CONCAT:

SELECT
  a.first_name,
  b.age
FROM
  names a JOIN ages b
    ON b.full_name LIKE CONCAT('%', a.first_name, '%')

或者LOCATE,返回a.first_nameb.full_name中第一次出现的位置:

SELECT
  a.first_name,
  b.age
FROM
  names a JOIN ages b
  ON LOCATE(a.first_name, b.full_name)

如果有匹配,则连接成功。

【讨论】:

LOCATE() 很有趣,当字符串存在于 b.full_name 中时会返回非零值,否则返回 false? @DonnyP locate 将返回 0 如果没有匹配,或者第一次出现名字的位置。 0 被认为等同于 False,如果值 >=1 则被认为是 True

以上是关于SQL在列上加入LIKE另一列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在列上创建自定义组并计算 sql 中的另一列

SQL:根据另一列的值在列上保留一个具有最大值的行

基于另一列的最大值的列上的 SQL 内连接 [重复]

两列上的 DENSE_RANK,其中一列是不同的值,另一列是重复的

如何在列上应用函数[重复]

内连接恰好在一列上,而在另一列上模糊