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_name
或 last_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_name
和 last_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
试试这个
函数
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###%';
我的 users
table:
user_id first_name last_name gender email
******* ********** ********* ****** *****
229 Natalie Fern F natalie.fern@hotmail.com
我想从 first_name
或 last_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_name
和 last_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
试试这个
函数
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###%';