考虑到两列,如何做一个 LIKE?

Posted

技术标签:

【中文标题】考虑到两列,如何做一个 LIKE?【英文标题】:How to do a LIKE considering two columns? 【发布时间】:2011-10-25 01:00:03 【问题描述】:

我有一个包含两列 first_namelast_name 的客户表。

如何在查询中使用 LIKE 来同时从两列中获取数据?

例如:

SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
FROM customer WHERE full_name LIKE 'John D%'

我试过了,它告诉我full_name 列不存在。

【问题讨论】:

Full Text Search 是 SQL 中做你想做的最有效的方法。 @OMG 因为我可以更改表和数据插入,所以我创建了一个新的索引列 full_name 并使用它来代替,因为答案中提到了性能问题。 【参考方案1】:
SELECT * 
FROM customer 
WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%' 

可能会很慢,但如果您的数据库非常小,这并不重要。使用CONCAT 时,请确保两个列名的排序规则相同,否则它将获取错误。

以下是我希望我的LIKE 语句同时适用于类别名称和课程名称的声明。我检查了两个表中的 cat_id,以便了解哪个课程属于哪个类别。

SELECT * FROM courses a INNER JOIN categories b ON a.cat_id=b.cat_id 
WHERE CONCAT(b.cat_name,' ',a.course_name)
LIKE :name ORDER BY b.cat_id

:名称是占位符(PDO)

【讨论】:

【参考方案2】:

使用HAVING 代替WHERE

SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
   FROM customer HAVING full_name LIKE 'John D%'

【讨论】:

为什么 HAVING 而不是 WHERE?【参考方案3】:

我手头没有mysql,但你不能像下面的代码那样做吗?

SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
FROM customer WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%'

免责声明:这可能会很慢!!!

【讨论】:

【参考方案4】:
SELECT CONCAT(first_name, ' ', last_name) as 'full_name' 
FROM customer WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%'

【讨论】:

您可能还需要修剪 first_name 和 last_name 以解决列中可能存在的额外空格。 如果用户也可以输入“姓氏,名字”变体,您也可以检查它。 如此简单,精彩。 danke :) 'CONCAT' 不是可识别的内置函数名称。 在 where 子句中使用 'full_name' 有什么问题?【参考方案5】:

你快到了

SELECT * 
FROM customer 
WHERE CONCAT(first_name, ' ', last_name) LIKE 'John D%'

注意:这可能没有很好的性能。你可以考虑full text search。

【讨论】:

以上是关于考虑到两列,如何做一个 LIKE?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Thymeleaf 和 HTML 将数据显示到两列?

Laravel 关系一到两列

SQL - 从单列到两列的所有日期组合

Nibernate 映射到两列相同的表

熊猫将一列映射到两列的组合

DataFrame:从一列中的字符串字典到两列中的浮点数 'latitude': '34.04', 'longitude': '-118.24' [重复]