PostgreSQL 中 IN 和 ANY 运算符的区别
今天,我们将详细了解 PostgreSQL 中 IN
和 ANY
运算符的工作原理。但是,请记住,两者都是标准 SQL 运算符,这意味着我们可以在多个管理平台上使用它们。
通过一一查看它们并通过一些示例,我们将能够对它们有很多了解。
PostgreSQL 中的 IN
运算符
你将在 PostgreSQL 文档中列出的子查询表达式下找到 IN
和 ANY
。
语法:
expression IN (subquery)
上面的子查询是一个为返回结果而编写的查询,在我们的例子中,正好是一列。为什么?因为不同的列包含各自的数据集。
我们想在这个查询中找到表达式,所以我们使用运算符 IN
。如果表达式匹配子查询返回的列下的任何行,IN
运算符将返回 TRUE;否则,返回 FALSE。
如果表达式和子查询倾向于为 NULL,则 IN
运算符将返回 NULL。
现在让我们假设我们没有一个表达式,而是一组表达式,这意味着我们需要查看它是否存在的一整行。在这种情况下,IN
运算符还具有评估语法:
row_constructor IN (subquery)
row_constructor
从一组值构建有效行,例如在以下查询中:
SELECT ROW('cat', 'adam');
在单独的未分类列下创建具有两个值的行。因此,它有助于从提供给其构造函数的任意数量的值构建行。
现在回到我们最初的陈述。
此语句中的子查询将返回一组包含多列的行,而不是一组包含单列的行。到目前为止,可以将整行与返回的行进行比较。
在这种情况下,最好使用此语法进行评估。如果整行匹配,则返回 TRUE,否则返回 FALSE。
同样,你可以应用 NOT IN
运算符,它将返回完全相反的结果。
现在,让我们来看一个例子。首先,我们将创建一个包含两列的表 cat
:ID
和 NAME
。
CREATE TABLE cat (
ID int PRIMARY KEY,
NAME TEXT
)
我们将继续在我们的表中插入两个值。
INSERT INTO cat VALUES(1, 'Adam'), (2, 'Jake')
让我们看看我们的表是否有名称 Adam
。
Select 'Adam' in (Select Name from cat)
输出:
现在,搜索一整行怎么样?让我们继续使用我们的行构造函数。
现在,我们想要找到 Adam
但这次有一个 ID,并将其与 NAME
列以及从 cat
表返回的整个行进行比较。
select ROW(1, 'Adam') in (SELECT * from cat)
它还将返回一个具有 TRUE 值的 TABLE。
现在你已经了解了 IN
运算符的主要用法,让我们继续了解 ANY
的工作原理。
PostgreSQL 中的 ANY
运算符
ANY
运算符与 IN
运算符相同。如果行匹配,ANY
也返回 TRUE,否则返回 FALSE。
它使用 ANY/SOME
关键字,类似于 IN
运算符。要使用 ANY
运算符,你可以继续为我们上面的表格编写如下内容:
Select 'Adam' = any (Select Name from cat)
所以,我们必须在这里使用一个运算符,并且 ANY
运算符返回 TRUE,因为 Adam
存在。对于行构造函数,请使用以下内容。
Select ROW(1, 'Adam' ) = any (Select * from cat)
我们可以在此处列出的差异之一是在 ANY/SOME
语法中使用了另一个运算符。如果你想查看某些内容是否等于返回的行并希望返回 TRUE,请使用上面给出的查询语法。
但是,例如,如果你必须在表中搜索值 John
并仍然返回 TRUE,你可以继续编写以下内容:
Select 'John' != any (Select Name from cat)
它将返回 TRUE,因为没有猫名 John
。
除此之外,还有其他各种差异值得一提。
PostgreSQL 中 IN
和 ANY
运算符之间的区别
PostgreSQL 中有两种语法变体 IN
和 ANY
。我们阅读了使用要搜索的单个值的第一个语法,但我们在行构造函数的第二个变体中略有不同。
行搜索的变体差异
在我们的表中是值 Adam
和 Jake
。我们想在 WHERE
语句中使用这些来搜索。
我们可以这样写。
SELECT * from cat
WHERE (ID, NAME) = any(ARRAY[(1, 'Adam'), (2, 'Jake')])
这将有助于找到 cat
表中的所有值,该数组具有我们用于搜索的自定义值。
假设我们有以下配置:
-----
(1, 'Adam')
(1, 'John')
(2, 'Marta')
(2, 'Mack')
(2, 'Kitty')
(3, 'Mars')
-----
查看上表中的所有行在我们的 cat
表中是否有一些相似的行,然后返回这些行。我们最好在 ANY
运算符中使用数组,这将有助于我们操作和查询所有这些值。
当然,这主要用作函数,不能被 JOIN
调用,使 ANY
更有效。
ANY
运算符的各种修改
你还可以将 LIKE
、WHERE
或此类运算符与 ANY
一起使用。所以,你可以这样说:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
它会将 Adam
与数组中给出的任何单词进行比较。它不是 LIKE FOO,
,而是 LIKE %oo%
,因此查询返回 TRUE。
结论
今天,你了解了 IN
与 ANY
运算符的不同之处。
尽管两者相似,但 ANY
运算符比 IN
更大更好。由于它的应用,它可以在主要编码程序中节省空间和时间(在较小程度上)。
Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!
GitHub