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

问题描述 投票:2回答:5

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

user_id first_name  last_name   gender  email
******* **********  *********   ******  *****
229     Natalie     Fern        F   [email protected]

我想从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

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

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

谢谢。

mysql sql search sql-like
5个回答
1
投票

您正在使用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

1
投票

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

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

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

这里有一些例子:

  • MySQL:CONCAT()
  • Oracle:CONCAT(),||
  • SQL Server:+

1
投票

试试这个

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

0
投票

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

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

0
投票

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

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###%';
© www.soinside.com 2019 - 2024. All rights reserved.