PostgreSQL中的模式匹配和正規表示式 - Das

banq發表於2022-02-15

在本文中,我將討論 PostgreSQL 中的模式匹配和正規表示式。
編寫查詢的一個重要方面是使用者應該能夠過濾和選擇系統需要訪問的資料。額外的或不必要的資料會增加頻寬並降低查詢的效能。因此,SQL 提供了一個過濾謂詞“WHERE”,使用者可以使用它過濾查詢並選擇僅匹配過濾謂詞的結果。
 

PostgreSQL 中的正規表示式
在正常的 SQL 操作的情況下,LIKE 運算子很好,但是在過濾大型資料庫時,LIKE 運算子似乎存在一些效能問題。此外,使用 LIKE 運算子的過濾條件僅限於透過包含萬用字元 (%) 來查詢模式。
為了克服這個問題,PostgreSQL 提供了一種使用正規表示式進行模式匹配的高階方法。長期以來,正規表示式在程式語言中被大量使用,然而,在 SQL 語句中使用這些正規表示式,使得查詢高度動態化,並且在大型資料庫中表現更好。
PostgreSQL 中的正規表示式是使用 TILDE ( ~ ) 運算子實現的,並使用 '.* ”作為萬用字元運算子。

SELECT * from GreaterManchesterCrime WHERE CrimeID = '^.*$';

正如你看到的,我們在PostgreSQL中使用了正規表示式,使用了TILDE(~)運算子和萬用字元'.*'。這個查詢將從GreaterManchesterCrime表中選擇所有具有有效CrimeID的記錄。由於模式條件只是萬用字元,它將從表中獲取所有記錄。
另外,在PostgreSQL中編寫正規表示式時需要注意的另一點是,模式匹配語句總是以"^"運算子開始,以"$"符號結束。這兩個運算子標誌著正規表示式語句的開始和結束。總結一下圖,在使用萬用字元過濾所有記錄時,表示式可以實現為"^.*$"。
 

正規表示式 - 以數字或字元開頭的字串
在上一節中,我們已經學會了如何透過使用萬用字元來實現正規表示式。現在,我們將向前邁進一步,嘗試為列CrimeID獲取以字元或數字開頭的記錄。
在PostgreSQL中,可以使用"[a-z]"或"[A-Z]"模式來匹配字母數字字元,這取決於我們試圖匹配的情況。這裡需要注意的一點是,由於PostgreSQL是區分大小寫的,因此,必須在模式中指定我們要匹配的確切大小寫。
同樣地,對於匹配數字,我們可以使用"[0-9]"或"/d"。現在我們對使用Regex過濾字元和數字有了一些瞭解,讓我們繼續在資料庫中實現它。
對於匹配的字元 -

SELECT * FROM GreaterManchesterCrime WHERE CrimeID ~ '^[AZ].*$'


CrimeID 欄位已被過濾,僅包含 ID 以大寫字母開頭的記錄。請注意這裡再次使用萬用字元“ .* ”來表示 SQL 語句中第一個字元之後的任何內容。
要過濾語句中的數字,我們可以簡單地編寫如下查詢:

SELECT * FROM GreaterManchesterCrime WHERE CrimeID ~ '^[0–9].*$'

只有以數字開頭的CrimeID的記錄被過濾以匹配正規表示式條件。
 

 

正規表示式——以重複數字或字元開頭的字串
在本文的前一節中,我們已經瞭解瞭如何在 PostgreSQL 中使用正規表示式語法編寫 SQL 查詢,以及如何在被過濾的字串的第一個位置過濾字元和數字。
現在,讓我們為要求新增一些更復雜的內容,並過濾開頭以多個字元或數字開頭的記錄。PostgreSQL 只需在花括號內提供計數,就可以非常容易地指定重複次數。或者,您也可以多次重複相同的字元模式匹配以匹配您的條件。例如,我們想過濾所有以兩個字元開頭的記錄。這個查詢可以寫成如下。

SELECT * FROM GreaterManchesterCrime WHERE CrimeID ~ '^[AZ] [AZ].*$'


或者

SELECT * FROM GreaterManchesterCrime WHERE CrimeID ~ '^[AZ] {2}.*$'


我們使用花括號中的數字來表示在列中查詢模式的次數。這使得查詢非常動態,因為您可以指定要在查詢中搜尋的任意數量的字元,您將獲得結果。
同樣,您也可以為重複數值實現相同的邏輯。在這種情況下,查詢可以編寫如下。

SELECT * FROM GreaterManchesterCrime WHERE CrimeID ~ '^[0–9]{2}.*$'

這展示了在過濾重複數值的同時使用正規表示式進行模式匹配的實現。
 

正規表示式——以字元和數字開頭的字串
在本文的最後一部分中,我們將結合到目前為止所看到的內容。我們將構建查詢並匹配將過濾以字元開頭並後跟數字的記錄的模式。要形成本規範的查詢,您可以在正規表示式中組合字母和數字字元的條件。SQL 語句可以寫成如下。

SELECT * FROM GreaterManchesterCrime WHERE CrimeID ~ '^[AZ][0–9].*$'



 

相關文章