PostgreSQL 中 IN 和 ANY 运算符的区别

Bilal Shahid 2024年2月15日
  1. PostgreSQL 中的 IN 运算符
  2. PostgreSQL 中的 ANY 运算符
  3. PostgreSQL 中 INANY 运算符之间的区别
  4. 结论
PostgreSQL 中 IN 和 ANY 运算符的区别

今天,我们将详细了解 PostgreSQL 中 INANY 运算符的工作原理。但是,请记住,两者都是标准 SQL 运算符,这意味着我们可以在多个管理平台上使用它们。

通过一一查看它们并通过一些示例,我们将能够对它们有很多了解。

PostgreSQL 中的 IN 运算符

你将在 PostgreSQL 文档中列出的子查询表达式下找到 INANY

语法:

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 运算符,它将返回完全相反的结果。

现在,让我们来看一个例子。首先,我们将创建一个包含两列的表 catIDNAME

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)

输出:

in vs any 运算符输出

现在,搜索一整行怎么样?让我们继续使用我们的行构造函数。

现在,我们想要找到 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 中 INANY 运算符之间的区别

PostgreSQL 中有两种语法变体 INANY。我们阅读了使用要搜索的单个值的第一个语法,但我们在行构造函数的第二个变体中略有不同。

行搜索的变体差异

在我们的表中是值 AdamJake。我们想在 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 运算符的各种修改

你还可以将 LIKEWHERE 或此类运算符与 ANY 一起使用。所以,你可以这样说:

SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');

它会将 Adam 与数组中给出的任何单词进行比较。它不是 LIKE FOO,,而是 LIKE %oo%,因此查询返回 TRUE。

结论

今天,你了解了 INANY 运算符的不同之处。

尽管两者相似,但 ANY 运算符比 IN 更大更好。由于它的应用,它可以在主要编码程序中节省空间和时间(在较小程度上)。

作者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

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