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