gpt4 book ai didi

sql - 使用 exists select 1 获取其中任何列包含序列的行

转载 作者:行者123 更新时间:2023-12-04 20:56:38 26 4
gpt4 key购买 nike

我有一个包含以下值的三列的表 ( dbFiddle )

C1      C2         C3
----------------------------
Red Yellow Blue
null Red Green
Yellow null Violet

我正在尝试创建一个查询来返回所有包含值“Yellow”的行,而不使用 INOR。如果我执行以下查询:

SELECT 1 
FROM test
WHERE CONCAT(C1, C2, C3) LIKE '%Yellow%'

它正确返回指定的行。但是,如果我尝试在 exists 中使用此查询:

SELECT * 
FROM test
WHERE EXISTS (SELECT 1 FROM test WHERE CONCAT(C1, C2, C3) LIKE '%Yellow%')

它返回所有行,而不仅仅是带有“黄色”字样的两行。我在这里做错了什么?

如有任何帮助,我们将不胜感激。

最佳答案

重新

SELECT 1 FROM test WHERE CONCAT(C1, C2, C3) LIKE '%Yellow%'

"correctly returns the rows specified"

select 返回单列 1,尽管这是因为有一行在其文本某处有一个包含 Yellow 的列。

这是因为EXISTS :

Returns TRUE if a subquery contains any rows.

即以下所有查询还返回了 test 表中的所有行:

SELECT * FROM test WHERE EXISTS (SELECT 1);

SELECT * FROM test WHERE EXISTS (SELECT 0);

SELECT * FROM test WHERE EXISTS (SELECT NULL);

... 仅仅是因为 SELECT 至少返回一行!

EXISTS 的常用用法还包括将 EXISTS 中的子查询关联回外部选择。

相关性示例

在下面的人为示例中,我们有 4 个人住在两所房子里。在这里,我们使用 EXISTS 来找出快乐的人的名字,还有同样快乐的人 else 住在同一个(相关的)房子里。

CREATE TABLE House
(
HouseId INT PRIMARY KEY,
Name VARCHAR(MAX)
);

CREATE TABLE Person
(
PersonId INT PRIMARY KEY,
HouseId INT FOREIGN KEY REFERENCES HOUSE(HouseId),
Name VARCHAR(MAX),
IsHappy BIT
);

INSERT INTO House(HouseId, Name) VALUES (1, 'House1'), (2, 'House2');

INSERT INTO Person(PersonId, HouseId, Name, IsHappy) VALUES
(1, 1, 'Joe', 0),
(2, 1, 'Jim', 1),
(3, 2, 'Fred', 1),
(4, 2, 'Mary', 1);

SELECT pOuter.Name
FROM Person pOuter
WHERE pOuter.IsHappy = 1
AND EXISTS
(SELECT 1
FROM Person pInner
WHERE pInner.HouseId = pOuter.HouseId
AND pInner.PersonId != pOuter.PersonId
AND pInner.IsHappy = 1);

返回

Mary
Fred

(显然还有其他方法可以找到相同的结果,例如找到存在 2 个或更多快乐人的 House Id 分组等)

关于sql - 使用 exists select 1 获取其中任何列包含序列的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50781500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com