SQL使用like运算符在多个字段上查找相同的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL使用like运算符在多个字段上查找相同的值相关的知识,希望对你有一定的参考价值。

我在users表中记录了这些记录:

user_id first_name  last_name   gender  email
******* **********  *********   ******  *****
229     Natalie     Fern        F   natalie.fern@hotmail.com

我想从First NameLast Name搜索相同的first_namelast_name

我创建了sql查询但没有获取记录。

SELECT *
FROM user_detail
WHERE first_name LIKE '%Natalie Fern%'
OR last_name LIKE '%Natalie Fern%'
LIMIT 0 , 30

您注意到我从两个字段传递名字和姓氏。

任何想法为什么我没有得到记录?

谢谢。

答案

您正在使用LIKE运算符用于first_namelast_name,如下所示:

LIKE '%Natalie Fern%'

这只会匹配包含“Natalie Fern”后跟任何内容的字符串。但由于名字和姓氏列仅包含(惊讶)名字和姓氏,因此您的查询不匹配任何记录。您可以使用CONCAT尝试匹配名字和姓氏的组合:

SELECT *
FROM user_detail
WHERE CONCAT(first_name, ' ', last_name)
LIKE '%Natalie Fern%'
LIMIT 0, 30

如果您想检查名字可能是“Natalie”或“Fern”的人,那么您可以使用此查询:

SELECT *
FROM user_detail
WHERE first_name LIKE '%Natalie%'
OR first_name LIKE '%Fern%'
OR last_name LIKE '%Natalie%'
OR last_name LIKE '%Fern%'
LIMIT 0, 30
另一答案

你没有记录,因为没有列包含像“娜塔莉蕨”这样的东西。

你必须concat两列,你应该得到正确的结果。

列的位串联不是标准。所以你必须查看DBMS的文档。

这里有一些例子:

  • mysql:CONCAT()
  • Oracle:CONCAT(),||
  • SQL Server:+
另一答案

试试这个

Sql Fiddle

功能

CREATE  FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20))
RETURNS @Strings TABLE
(   
  position int IDENTITY PRIMARY KEY,
  value varchar(8000)  
)
AS
BEGIN

DECLARE @index int
SET @index = -1

WHILE (LEN(@text) > 0)
  BEGIN 
    SET @index = CHARINDEX(@delimiter , @text) 
    IF (@index = 0) AND (LEN(@text) > 0) 
      BEGIN  
        INSERT INTO @Strings VALUES (@text)
          BREAK 
      END 
    IF (@index > 1) 
      BEGIN  
        INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))  
        SET @text = RIGHT(@text, (LEN(@text) - @index)) 
      END 
    ELSE
      SET @text = RIGHT(@text, (LEN(@text) - @index))
    END
  RETURN
END

询问

SELECT * FROM user_detail inner join 
(select value from fn_split('Natalie Fern',' ')) as split_table 
on (user_detail.first_name like '%'+split_table.value+'%' 
or user_detail.last_name like '%'+split_table.value+'%' ;
另一答案

而不是LIKE你可以使用LOCATE来查看名字是否在一个字符串中

SELECT *
FROM user_detail
WHERE LOCATE(first_name,'Natalie Fern') > 0
OR LOCATE(last_name ,'Natalie Fern') > 0 
LIMIT 0 , 30
另一答案

如果您需要使用一个搜索输入字段执行此搜索:

SELECT * 
FROM user_detail 
WHERE last_name LIKE '%###VALUE###%' 
OR first_name LIKE '%###VALUE###%' 
OR concat(last_name, ' ', first_name) LIKE '%###VALUE###%' 
OR concat(first_name, ' ', last_name) LIKE '%###VALUE###%';

以上是关于SQL使用like运算符在多个字段上查找相同的值的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 转义select …. like中的特殊字符(百分号)

MySql中如何在一个字段(值为字符串)中查找某一个字符

在T-SQL中具有可变数量的搜索条件的LIKE运算符

Mysql查找如何判断字段是不是包含某个字符串

求SQL语句,一个字段中多个ID,如何对他进行对应的值替换?

LIKE运算符