PostgreSQL 中 IN 和 ANY 運算子的區別

Bilal Shahid 2023年1月30日
  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