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

SQL find same value on multiple filelds with like operator

我的 users table:

有这些记录
user_id first_name  last_name   gender  email
******* **********  *********   ******  *****
229     Natalie     Fern        F   natalie.fern@hotmail.com

我想从 first_namelast_name.

中搜索相同的 First Name & Last Name

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

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

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

知道为什么我没有收到记录吗?

谢谢。

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

LIKE '%Natalie Fern%'

这只会匹配包含 anything 后跟 'Natalie Fern' 后跟 anything 的字符串。但是由于名字和姓氏列仅包含(令人惊讶的)名字和姓氏,因此您的查询不匹配任何记录。您可以使用 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

您没有得到任何记录,因为没有列包含类似 "Natalie Fern" 的内容。

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

但是列的连接不是标准。所以你必须查看你的 DBMS 的文档。

这里有一些例子:

  • MySQL: CONCAT( )
  • 甲骨文:CONCAT( ), ||
  • SQL 服务器:+

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

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

试试这个

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+'%' ;

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

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###%';