使用 'LIKE' 和 SQL 子查询的结果
Using 'LIKE' with the result of a SQL subquery
以下查询对我来说绝对没问题:
SELECT * From Customers
WHERE Customers.ContactName = (SELECT FirstName
FROM Employees as E, orders as O
WHERE <condition>
LIMIT 1);
但是,如果我使用 LIKE
而不是 =
来与子查询的结果进行比较,我不会得到任何结果。
如何在上述查询中使用 LIKE '%%'
?
我想这应该适合你,不是吗?
SELECT * From Customers
WHERE Customers.ContactName LIKE '%' + (
SELECT FirstName from Employees as E, orders as O
WHERE <condition>
LIMIT 1
) + '%';
首先,这个查询应该不能正常工作:
SELECT *
From Customers
WHERE Customers.ContactName = (SELECT FirstName
from Employees as E, orders as O
WHERE LIMIT 1);
因为WHERE LIMIT 1
不合适SQL。而且,您应该学会使用正确的 join
语法。据推测,您打算:
SELECT c.*
From Customers c
WHERE c.ContactName = (SELECT FirstName
FROM Employees as E JOIN
Orders as O
ON . . .
LIMIT 1
);
您可以想象在子查询中添加 LIKE
而不是 =
和 '%':
WHERE c.ContactName LIKE (SELECT CONCAT('%', FirstName, '%') . . .
但我会使用 EXISTS
:
来写这个
SELECT c.*
From Customers c
WHERE EXISTS (SELECT 1
FROM Employees as E JOIN
Orders as O
ON . . .
WHERE c.ContactName LIKE CONCAT('%', FirstName, '%')
);
这与您的查询不完全相同。它做了一些更合理的事情。它不是比较子查询中的一个随机名称,而是确定子查询中是否有 any 匹配项。这似乎是一个更合理的查询意图。
SQL 服务器
这将 return 特定关键字
select *
from Customers
where Customers.ContactName like (select top 1 FirstName from Employees )
这将 return 如果关键字存在
select *
from Customers
where Customers.ContactName like '%' + (select top 1 FirstName from Employees) + '%'
我建议:
SELECT * From Customers as a
INNER JOIN (SELECT '%'+FirstName+'%' as FirstName from Employees as E, orders as O
WHERE <condition>
LIMIT 1) as b
ON a.ContactName LIKE b.Firstname;
如果你有员工的外键 table 那么你不需要使用 LIKE。但是,如果您想使用它,可以尝试关注
select *
from customers a, employees b
where (contions on employees)
and customers.contactname like '%'||b.firstname||'%';
使用您的方法,您需要用“%”将 FirstName 字段的两边括起来,以便将通配符放入您选择的值中。
所以,像
SELECT * From Customers
WHERE Customers.ContactName LIKE (SELECT '%' + FirstName + '%'
from Employees as E
inner join, orders as O on...
WHERE <condition>
LIMIT 1);
在我看来你最好加入你的桌子。也许这样会更好
SELECT c.*
FROM Customers c
INNER JOIN Employees e on c.ContactName like '%' + e.FirstName + '%'
WHERE <condition>
下面的查询是MSSQL语句,我用CHARINSDEX
代替了LIKE
。尝试 MySQL 中的相关函数(检查 INSTR
函数)而不是 CHARINDEX
.
SELECT
*
FROM
Customers
WHERE
CHARINDEX(( SELECT TOP 1 FirstName
FROM Employees as E, orders as O
WHERE <condition>
), Customers.ContactName, 1
) > 0;
我不确定,但您可以在 MySQL
.
中尝试以下操作
SELECT
*
FROM
Customers
WHERE
INSTR(Customers.ContactName,
( SELECT FirstName
FROM Employees as E, orders as O
WHERE <condition>
LIMIT 1)) > 0;
为什么不用简单的 INNER JOIN
:
SELECT Customers.*
FROM Customers
INNER JOIN Employees ON Customers.ContactName LIKE CONCAT('%', Employees.FirstName,'%')
WHERE Employees.Foo = 'Bar'
注意:+
是加法运算符,不能用于连接字符串。
以下查询对我来说绝对没问题:
SELECT * From Customers
WHERE Customers.ContactName = (SELECT FirstName
FROM Employees as E, orders as O
WHERE <condition>
LIMIT 1);
但是,如果我使用 LIKE
而不是 =
来与子查询的结果进行比较,我不会得到任何结果。
如何在上述查询中使用 LIKE '%%'
?
我想这应该适合你,不是吗?
SELECT * From Customers
WHERE Customers.ContactName LIKE '%' + (
SELECT FirstName from Employees as E, orders as O
WHERE <condition>
LIMIT 1
) + '%';
首先,这个查询应该不能正常工作:
SELECT *
From Customers
WHERE Customers.ContactName = (SELECT FirstName
from Employees as E, orders as O
WHERE LIMIT 1);
因为WHERE LIMIT 1
不合适SQL。而且,您应该学会使用正确的 join
语法。据推测,您打算:
SELECT c.*
From Customers c
WHERE c.ContactName = (SELECT FirstName
FROM Employees as E JOIN
Orders as O
ON . . .
LIMIT 1
);
您可以想象在子查询中添加 LIKE
而不是 =
和 '%':
WHERE c.ContactName LIKE (SELECT CONCAT('%', FirstName, '%') . . .
但我会使用 EXISTS
:
SELECT c.*
From Customers c
WHERE EXISTS (SELECT 1
FROM Employees as E JOIN
Orders as O
ON . . .
WHERE c.ContactName LIKE CONCAT('%', FirstName, '%')
);
这与您的查询不完全相同。它做了一些更合理的事情。它不是比较子查询中的一个随机名称,而是确定子查询中是否有 any 匹配项。这似乎是一个更合理的查询意图。
SQL 服务器
这将 return 特定关键字
select *
from Customers
where Customers.ContactName like (select top 1 FirstName from Employees )
这将 return 如果关键字存在
select *
from Customers
where Customers.ContactName like '%' + (select top 1 FirstName from Employees) + '%'
我建议:
SELECT * From Customers as a
INNER JOIN (SELECT '%'+FirstName+'%' as FirstName from Employees as E, orders as O
WHERE <condition>
LIMIT 1) as b
ON a.ContactName LIKE b.Firstname;
如果你有员工的外键 table 那么你不需要使用 LIKE。但是,如果您想使用它,可以尝试关注
select *
from customers a, employees b
where (contions on employees)
and customers.contactname like '%'||b.firstname||'%';
使用您的方法,您需要用“%”将 FirstName 字段的两边括起来,以便将通配符放入您选择的值中。
所以,像
SELECT * From Customers
WHERE Customers.ContactName LIKE (SELECT '%' + FirstName + '%'
from Employees as E
inner join, orders as O on...
WHERE <condition>
LIMIT 1);
在我看来你最好加入你的桌子。也许这样会更好
SELECT c.*
FROM Customers c
INNER JOIN Employees e on c.ContactName like '%' + e.FirstName + '%'
WHERE <condition>
下面的查询是MSSQL语句,我用CHARINSDEX
代替了LIKE
。尝试 MySQL 中的相关函数(检查 INSTR
函数)而不是 CHARINDEX
.
SELECT
*
FROM
Customers
WHERE
CHARINDEX(( SELECT TOP 1 FirstName
FROM Employees as E, orders as O
WHERE <condition>
), Customers.ContactName, 1
) > 0;
我不确定,但您可以在 MySQL
.
SELECT
*
FROM
Customers
WHERE
INSTR(Customers.ContactName,
( SELECT FirstName
FROM Employees as E, orders as O
WHERE <condition>
LIMIT 1)) > 0;
为什么不用简单的 INNER JOIN
:
SELECT Customers.*
FROM Customers
INNER JOIN Employees ON Customers.ContactName LIKE CONCAT('%', Employees.FirstName,'%')
WHERE Employees.Foo = 'Bar'
注意:+
是加法运算符,不能用于连接字符串。