当前位置: 首页 > 面试题库 >

在WHERE子句中使用mysql concat()?

单于飞鸣
2023-03-14
问题内容

我想搜索我的表,其中有一列名字和一列姓氏。我目前接受来自某个字段的搜索字词,并将其与两列进行比较,一次

    select * from table where first_name like '%$search_term%' or 
    last_name like '%$search_term%';

这对于单个单词搜索词可以正常工作,但结果集包含名称为“
Larry”的所有人。但是,如果有人输入名字然后输入空格,然后输入姓氏,我希望搜索结果更窄。我已经尝试了以下方法,但没有成功。

    select * from table where first_name like '%$search_term%' or last_name 
    like '%$search_term%' or concat_ws(' ',first_name,last_name) 
    like '%$search_term%';

有什么建议吗?

编辑: 我正在测试的名称是“拉里·史密斯”。数据库将“ Larry”存储在“ first_name”列中,将“ Smith”存储在“
last_name”列中。数据干净,没有多余的空格,并且搜索词被左右修剪。

编辑2:
今天早上,我尝试了罗伯特·甘布尔的答案。他和我昨晚的跑步非常相似。我无法解释,但今天上午它奏效了。我能想到的唯一区别是,昨晚我在搜索查询的第三个“或”段中运行了concat函数(在查看了first_name和last_name之后)。今天上午,在浏览完上述内容以及地址和公司名称后,我将其作为最后一部分运行。

在查询末尾运行mysql函数是否比在中间运行更好?


问题答案:

您所拥有的应该可以工作,但可以简化为:

select * from table where concat_ws(' ',first_name,last_name) 
like '%$search_term%';

您能否提供一个示例名称和搜索词,该方法不起作用?



 类似资料:
  • 问题内容: 在WHERE子句中有使用SELECT语句描述的名称吗?这是好/不好的做法吗? 这会是更好的选择吗? 它远没有那么优雅,但是运行起来比以前的版本要快。我不喜欢它,因为它在GUI中没有非常清晰地显示(并且SQL初学者需要理解它)。我可以将其分为两个独立的查询,但是随后事情变得混乱了…… 注意:我不仅需要日期和分数(例如姓名) 问题答案: 称为相关子查询。它有它的用途。

  • 问题内容: 我想在Derby数据库中模拟以下类型的查询(即Microsoft SQL Server语法)的效果。目标是返回表中存储在“ someColumn”中的日期少于7天的所有记录。这是我希望实现的Microsoft SQL语法… 我已经能够确定在Derby中它将涉及使用timestampdiff函数。但是我不知道Derby中WHERE子句中函数用法的语法,因此我找不到任何示例。我发现了很多在

  • 问题内容: 假设我有这张桌子 我想返回第一行,其中所有先前现金的总和大于某个值: 因此,例如,如果我要返回第一行,其中所有先前现金的总和都大于500,则应返回到第3行 如何使用mysql语句执行此操作? 使用 不起作用 问题答案: 您只能在HAVING子句中使用聚合进行比较: 该子句要求您定义GROUP BY子句。 要获得第一行,其中所有先前现金的总和都大于某个值,请使用: 由于聚合函数发生在子查

  • 问题内容: 我正在执行以下查询,并为所有列使用别名。我用命名了别名。因为这是必需的。现在,我想直接在where子句中引用别名,我的操作如下所示: 但是,当我执行此操作时,出现以下错误: 我知道SQL首先执行where子句,因此这就是错误的原因。但是我该如何解决呢?有什么建议吗? 问题答案: 您已经知道不能在子句中使用别名,但这仅适用于相同级别的SQL。您可以将查询包装在外部查询中: 唯一的选择是重

  • 问题内容: 我想使用in子句,但它返回错误。 我可以在where子句中使用CASE吗?或如何解决?谢谢 问题答案: 就您而言,您只需要OR 一种情况是针对 值 ,而不是条件。条件在CASE表达式之外 例如

  • 如何将行号用作where子句的一部分? 我有,假设,25个数据,我只想得到前10行或得到从11到20的行。 如何使用行号?我无法执行下面的查询 更新:问题是,在我的where子句中,row_number在表UPDATE2:Thanks Guys中是未知的!不管怎样,我找到了这个。选择行号=行号的位置