支援的版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

9.4. 字串函數與運算子 #

本節描述用於檢查和操作字串值的函數和運算子。此處的字串包括 charactercharacter varyingtext 類型的值。除非另有說明,否則這些函數和運算子會宣告為接受並傳回 text 類型。它們會交替接受 character varying 引數。character 類型的值會在套用函數或運算子之前轉換為 text,導致移除 character 值中任何尾隨空格。

SQL定義了一些使用關鍵字而非逗號來分隔引數的字串函數。詳細資訊請參閱表 9.9PostgreSQL 也提供了這些函數的版本,這些版本使用常規函數呼叫語法 (請參閱 表 9.10)。

注意

字串串聯運算子 (||) 將接受非字串輸入,只要至少有一個輸入是字串類型,如 表 9.9 所示。對於其他情況,插入明確的 text 強制轉換可用於接受非字串輸入。

表 9.9. SQL字串函數與運算子

函數/運算子

說明

範例

text || texttext

串聯兩個字串。

'Post' || 'greSQL'PostgreSQL

text || anynonarraytext

anynonarray || texttext

將非字串輸入轉換為文字,然後串聯兩個字串。(非字串輸入不能是陣列類型,因為這會與陣列 || 運算子產生歧義。如果您要串聯陣列的文字等效項,請將其明確轉換為 text。)

'Value: ' || 42Value: 42

btrim ( string text [, characters text ] ) → text

string 的開頭和結尾移除僅包含 characters 中字元的 (預設為空格) 最長字串。

btrim('xyxtrimyyx', 'xyz')trim

text IS [NOT] [form] NORMALIZEDboolean

檢查字串是否為指定的 Unicode 正規化形式。 可選的 form 關鍵字指定形式: NFC (預設)、NFDNFKCNFKD。 只有當伺服器編碼為 UTF8 時,才能使用此運算式。 請注意,使用此運算式檢查正規化通常比正規化可能已正規化的字串更快。

U&'\0061\0308bc' IS NFD NORMALIZEDt

bit_length ( text ) → integer

傳回字串中的位元數 (8 乘以 octet_length)。

bit_length('jose')32

char_length ( text ) → integer

character_length ( text ) → integer

傳回字串中的字元數。

char_length('josé')4

lower ( text ) → text

根據資料庫的語系規則,將字串轉換為全部小寫。

lower('TOM')tom

lpad ( string text, length integer [, fill text ] ) → text

透過在 string 前面加上 fill 字元(預設為空格),將 string 擴展到 length 長度。 如果 string 已經長於 length,則將其截斷(從右側)。

lpad('hi', 5, 'xy')xyxhi

ltrim ( string text [, characters text ] ) → text

string 的開頭移除僅包含 characters 中的字元的最長字串(預設為空格)。

ltrim('zzzytest', 'xyz')test

normalize ( text [, form ] ) → text

將字串轉換為指定的 Unicode 正規化形式。 可選的 form 關鍵字指定形式:NFC(預設)、NFDNFKCNFKD。 僅當伺服器編碼為 UTF8 時,才能使用此函式。

normalize(U&'\0061\0308bc', NFC)U&'\00E4bc'

octet_length ( text ) → integer

傳回字串中的位元組數。

octet_length('josé')5 (如果伺服器編碼為 UTF8)

octet_length ( character ) → integer

傳回字串中的位元組數。 由於此版本的函式直接接受 character 類型,因此它不會移除尾隨空格。

octet_length('abc '::character(4))4

overlay ( string text PLACING newsubstring text FROM start integer [ FOR count integer ] ) → text

使用 newsubstring 替換從 start'th 字元開始的 string 子字串,並延伸 count 個字元。 如果省略 count,則預設為 newsubstring 的長度。

overlay('Txxxxas' placing 'hom' from 2 for 4)Thomas

position ( substring text IN string text ) → integer

傳回指定的 substringstring 內的第一次起始索引,如果不存在,則傳回零。

position('om' in 'Thomas')3

rpad ( string text, length integer [, fill text ] ) → text

透過在 string 後面附加 fill 字元(預設為空格),將 string 擴展到 length 長度。 如果 string 已經長於 length,則將其截斷。

rpad('hi', 5, 'xy')hixyx

rtrim ( string text [, characters text ] ) → text

string 的結尾移除僅包含 characters 中的字元的最長字串(預設為空格)。

rtrim('testxxzx', 'xyz')test

substring ( string text [ FROM start integer ] [ FOR count integer ] ) → text

提取 string 的子字串,如果指定了 start,則從第 start'th 個字元開始,如果指定了 count,則在 count 個字元後停止。 至少提供 startcount 之一。

substring('Thomas' from 2 for 3)hom

substring('Thomas' from 3)omas

substring('Thomas' for 2)Th

substring ( string text FROM pattern text ) → text

提取符合 POSIX 正則表達式的第一個子字串;請參閱第 9.7.3 節

substring('Thomas' from '...$')mas

substring ( string text SIMILAR pattern text ESCAPE escape text ) → text

substring ( string text FROM pattern text FOR escape text ) → text

提取符合SQL正則表達式的第一個子字串; 請參閱第 9.7.2 節。 第一種形式是自 SQL:2003 起指定的; 第二種形式僅在 SQL:1999 中,應視為已過時。

substring('Thomas' similar '%#"o_a#"_' escape '#')oma

trim ( [ LEADING | TRAILING | BOTH ] [ characters text ] FROM string text ) → text

string 的開頭、結尾或兩端(BOTH 是預設值)移除僅包含 characters 中字元(預設為空格)的最長字串。

trim(both 'xyz' from 'yxTomxx')Tom

trim ( [ LEADING | TRAILING | BOTH ] [ FROM ] string text [, characters text ] ) → text

這是 trim() 的非標準語法。

trim(both from 'yxTomxx', 'xyz')Tom

unicode_assigned ( text ) → boolean

如果字串中的所有字元都分配了 Unicode 碼位,則傳回 true;否則傳回 false。此函數只能在伺服器編碼為 UTF8 時使用。

upper ( text ) → text

根據資料庫的地區規則,將字串轉換為全部大寫。

upper('tom')TOM


其他字串操作函數和運算子可用,並列在 表 9.10 中。(其中一些在內部用於實作SQL列在 表 9.9 中的標準字串函數。)還有模式比對運算子,這些運算子在 第 9.7 節 中描述,以及用於全文檢索的運算子,這些運算子在 第 12 章 中描述。

表 9.10. 其他字串函數和運算子

函數/運算子

說明

範例

text ^@ textboolean

如果第一個字串以第二個字串開頭,則傳回 true (等同於 starts_with() 函數)。

'alphabet' ^@ 'alph't

ascii ( text ) → integer

傳回引數的第一個字元的數值代碼。在UTF8編碼中,傳回字元的 Unicode 碼位。在其他多位元組編碼中,引數必須是ASCII字元。

ascii('x')120

chr ( integer ) → text

傳回具有給定代碼的字元。在UTF8UTF8ASCII編碼中,該引數被視為 Unicode 碼位。在其他多位元組編碼中,該引數必須指定一個

字元。不允許 chr(0),因為文字資料類型無法儲存該字元。

chr(65)A

concat ( val1 "any" [, val2 "any" [, ...] ] ) → text

連接所有引數的文字表示形式。NULL 引數會被忽略。

concat('abcde', 2, NULL, 22)abcde222

concat_ws ( sep text, val1 "any" [, val2 "any" [, ...] ] ) → text

連接除第一個引數以外的所有引數,並使用分隔符。第一個引數用作分隔字串,且不應為 NULL。其他 NULL 引數會被忽略。

concat_ws(',', 'abcde', 2, NULL, 22)abcde,2,22

format ( formatstr text [, formatarg "any" [, ...] ] ) → text

根據格式字串格式化引數;請參閱 第 9.4.1 節。此函數類似於 C 函數 sprintf

format('Hello %s, %1$s', 'World')Hello World, World

initcap ( text ) → text

將每個單字的第一個字母轉換為大寫,其餘字母轉換為小寫。單字是由非字母數字字元分隔的字母數字字元序列。

initcap('hi THOMAS')Hi Thomas

left ( string text, n integer ) → text

傳回字串中的前 n 個字元,或者當 n 為負數時,傳回除了最後 |n| 個字元以外的所有字元。

left('abcde', 2)ab

length ( text ) → integer

傳回字串中的字元數。

length('jose')4

md5 ( text ) → text

計算引數的 MD5 雜湊,結果以十六進位寫入。

md5('abc')900150983cd24fb0​d6963f7d28e17f72

parse_ident ( qualified_identifier text [, strict_mode boolean DEFAULT true ] ) → text[]

qualified_identifier 分割成識別符陣列,移除個別識別符的任何引號。預設情況下,最後一個識別符之後的多餘字元被視為錯誤;但是如果第二個參數為 false,則會忽略這些多餘字元。(此行為對於剖析函數等物件的名稱很有用。)請注意,此函數不會截斷過長的識別符。如果需要截斷,您可以將結果轉換為 name[]

parse_ident('"SomeSchema".someTable'){SomeSchema,sometable}

pg_client_encoding ( ) → name

傳回目前的用戶端編碼名稱。

pg_client_encoding()UTF8

quote_ident ( text ) → textSQL語法字串。只有在必要時才會加上引號(例如,當字串包含非識別符號的字元,或是會被轉換為小寫時)。內嵌的引號會正確地重複出現。另請參閱範例 41.1

quote_ident('Foo bar')"Foo bar"

quote_literal ( text ) → text

傳回適當地加上引號的給定字串,以便在SQL語法字串中作為字串文字使用。內嵌的單引號和反斜線會正確地重複出現。請注意,quote_literal 在收到 null 輸入時會傳回 null;如果引數可能為 null,則 quote_nullable 通常更適合。另請參閱範例 41.1

quote_literal(E'O\'Reilly')'O''Reilly'

quote_literal ( anyelement ) → text

將給定的值轉換為文字,然後將其引用為文字。內嵌的單引號和反斜線會正確地重複出現。

quote_literal(42.5)'42.5'

quote_nullable ( text ) → text

傳回適當地加上引號的給定字串,以便在SQL語法字串;或者,如果引數為 null,則傳回 NULL。內嵌的單引號和反斜線會正確地重複出現。另請參閱範例 41.1

quote_nullable(NULL)NULL

quote_nullable ( anyelement ) → text

將給定的值轉換為文字,然後將其引用為文字;或者,如果引數為 null,則傳回 NULL。內嵌的單引號和反斜線會正確地重複出現。

quote_nullable(42.5)'42.5'

regexp_count ( string text, pattern text [, start integer [, flags text ] ] ) → integer

傳回 POSIX 正規表示式 patternstring 中匹配的次數;請參閱第 9.7.3 節

regexp_count('123456789012', '\d\d\d', 2)3

regexp_instr ( string text, pattern text [, start integer [, N integer [, endoption integer [, flags text [, subexpr integer ] ] ] ] ] ) → integer

傳回 string 中第 N 個匹配 POSIX 正規表示式 pattern 的位置,如果沒有這樣的匹配,則傳回零;請參閱第 9.7.3 節

regexp_instr('ABCDEF', 'c(.)(..)', 1, 1, 0, 'i')3

regexp_instr('ABCDEF', 'c(.)(..)', 1, 1, 0, 'i', 2)5

regexp_like ( string text, pattern text [, flags text ] ) → boolean

檢查在 string 中是否發生匹配 POSIX 正規表示式 pattern 的情況;請參閱第 9.7.3 節

regexp_like('Hello World', 'world$', 'i')t

regexp_match ( string text, pattern text [, flags text ] ) → text[]

傳回在第一次匹配 POSIX 正規表示式 patternstring 的結果中的子字串;請參閱第 9.7.3 節

regexp_match('foobarbequebaz', '(bar)(beque)'){bar,beque}

regexp_matches ( string text, pattern text [, flags text ] ) → setof text[]

傳回在第一次匹配 POSIX 正規表示式 patternstring 的結果中的子字串,如果使用 g 旗標,則傳回所有此類匹配中的子字串;請參閱第 9.7.3 節

regexp_matches('foobarbequebaz', 'ba.', 'g')

 {bar}
 {baz}

regexp_replace ( string text, pattern text, replacement text [, start integer ] [, flags text ] ) → text

取代第一次匹配 POSIX 正規表示式 pattern 的子字串,如果使用 g 旗標,則取代所有此類匹配;請參閱第 9.7.3 節

regexp_replace('Thomas', '.[mN]a.', 'M')ThM

regexp_replace ( string text, pattern text, replacement text, start integer, N integer [, flags text ] ) → text

取代字串中第 N 個符合 POSIX 正規表示式 pattern 的子字串,如果 N 為零,則取代所有符合的子字串;請參閱第 9.7.3 節

regexp_replace('Thomas', '.', 'X', 3, 2)ThoXas

regexp_split_to_array ( string text, pattern text [, flags text ] ) → text[]

使用 POSIX 正規表示式作為分隔符號分割 string,產生結果陣列;請參閱第 9.7.3 節

regexp_split_to_array('hello world', '\s+'){hello,world}

regexp_split_to_table ( string text, pattern text [, flags text ] ) → setof text

使用 POSIX 正規表示式作為分隔符號分割 string,產生一組結果;請參閱第 9.7.3 節

regexp_split_to_table('hello world', '\s+')

 hello
 world

regexp_substr ( string text, pattern text [, start integer [, N integer [, flags text [, subexpr integer ] ] ] ] ) → text

傳回 string 中符合第 N 次出現的 POSIX 正規表示式 pattern 的子字串,如果沒有匹配,則傳回 NULL;請參閱第 9.7.3 節

regexp_substr('ABCDEF', 'c(.)(..)', 1, 1, 'i')CDEF

regexp_substr('ABCDEF', 'c(.)(..)', 1, 1, 'i', 2)EF

repeat ( string text, number integer ) → text

重複 string 指定的 number 次數。

repeat('Pg', 4)PgPgPgPg

replace ( string text, from text, to text ) → text

string 中所有出現的子字串 from 替換為子字串 to

replace('abcdefabcdef', 'cd', 'XX')abXXefabXXef

reverse ( text ) → text

反轉字串中字元的順序。

reverse('abcde')edcba

right ( string text, n integer ) → text

傳回字串中最後 n 個字元,或者當 n 為負數時,傳回除了前 |n| 個字元之外的所有字元。

right('abcde', 2)de

split_part ( string text, delimiter text, n integer ) → text

delimiter 出現的地方分割 string,並傳回第 n 個欄位(從 1 開始計數),或者當 n 為負數時,傳回從最後算起的第 |n| 個欄位。

split_part('abc~@~def~@~ghi', '~@~', 2)def

split_part('abc,def,ghi,jkl', ',', -2)ghi

starts_with ( string text, prefix text ) → boolean

如果 stringprefix 開頭,則傳回 true。

starts_with('alphabet', 'alph')t

string_to_array ( string text, delimiter text [, null_string text ] ) → text[]

delimiter 出現的地方分割 string,並將產生的欄位組成一個 text 陣列。如果 delimiterNULL,則 string 中的每個字元都將成為陣列中的一個獨立元素。如果 delimiter 是空字串,則 string 被視為單個欄位。如果提供 null_string 且不為 NULL,則與該字串匹配的欄位將被替換為 NULL。另請參閱 array_to_string

string_to_array('xx~~yy~~zz', '~~', 'yy'){xx,NULL,zz}

string_to_table ( string text, delimiter text [, null_string text ] ) → setof text

delimiter 出現的地方分割 string,並將產生的欄位作為一組 text 列傳回。如果 delimiterNULL,則 string 中的每個字元都將成為結果的一個獨立列。如果 delimiter 是空字串,則 string 被視為單個欄位。如果提供 null_string 且不為 NULL,則與該字串匹配的欄位將被替換為 NULL

string_to_table('xx~^~yy~^~zz', '~^~', 'yy')

 xx
 NULL
 zz

strpos ( string text, substring text ) → integer

傳回指定的 substringstring 中首次出現的起始索引,如果不存在則傳回零。(與 position(substring in string) 相同,但請注意參數順序相反。)

strpos('high', 'ig')2

substr ( string text, start integer [, count integer ] ) → text

提取 string 中從第 start 個字元開始的子字串,並延伸 count 個字元(如果指定)。(與 substring(string from start for count) 相同。)

substr('alphabet', 3)phabet

substr('alphabet', 3, 2)ph

to_ascii ( string text ) → text

to_ascii ( string text, encoding name ) → text

to_ascii ( string text, encoding integer ) → text

string 轉換為ASCII來自另一種編碼,該編碼可以通過名稱或數字來識別。 如果省略 encoding,則假定為資料庫編碼(實際上這是唯一有用的情況)。 轉換主要包括刪除重音符號。 僅支持從 LATIN1LATIN2LATIN9WIN1250 編碼進行轉換。(有關另一個更靈活的解決方案,請參閱 unaccent 模組。)

to_ascii('Karél')Karel

to_bin ( integer ) → text

to_bin ( bigint ) → text

將數字轉換為其等效的二補數二進位表示形式。

to_bin(2147483647)1111111111111111111111111111111

to_bin(-1234)11111111111111111111101100101110

to_hex ( integer ) → text

to_hex ( bigint ) → text

將數字轉換為其等效的二補數十六進位表示形式。

to_hex(2147483647)7fffffff

to_hex(-1234)fffffb2e

to_oct ( integer ) → text

to_oct ( bigint ) → text

將數字轉換為其等效的二補數八進位表示形式。

to_oct(2147483647)17777777777

to_oct(-1234)37777775456

translate ( string text, from text, to text ) → text

string 中與 from 集合中的字元匹配的每個字元替換為 to 集合中的相應字元。 如果 fromto 長,則刪除 from 中額外字元的出現。

translate('12345', '143', 'ax')a2x5

unistr ( text ) → text

評估參數中逸出的 Unicode 字元。 Unicode 字元可以指定為 \XXXX(4 個十六進位數字)、\+XXXXXX(6 個十六進位數字)、\uXXXX(4 個十六進位數字)或 \UXXXXXXXX(8 個十六進位數字)。 要指定反斜線,請寫兩個反斜線。 所有其他字元都按字面意義採用。

如果伺服器編碼不是 UTF-8,則由這些逸出序列之一識別的 Unicode 代碼點將轉換為實際的伺服器編碼; 如果這不可能,則會報告錯誤。

此函數提供了一種(非標準)替代方案,用於帶有 Unicode 逸出的字串常數(請參閱 第 4.1.2.3 節)。

unistr('d\0061t\+000061')data

unistr('d\u0061t\U00000061')data


concatconcat_wsformat 函數是可變參數的,因此可以將要連接或格式化的值作為帶有 VARIADIC 關鍵字的陣列傳遞(請參閱 第 36.5.6 節)。 陣列的元素被視為函數的單獨普通參數。 如果可變參數陣列參數為 NULL,則 concatconcat_ws 傳回 NULL,但 format 將 NULL 視為零元素陣列。

另請參閱 第 9.21 節中的聚合函數 string_agg,以及 表 9.13 中用於在字串和 bytea 類型之間轉換的函數。

9.4.1. format #

函數 format 產生根據格式字串格式化的輸出,其樣式類似於 C 函數 sprintf

format(formatstr text [, formatarg "any" [, ...] ])

formatstr 是一個格式字串,用於指定結果應該如何格式化。格式字串中的文字會直接複製到結果中,除非遇到格式指定符。 格式指定符在字串中充當佔位符,定義後續的函數引數應如何格式化並插入到結果中。每個 formatarg 引數會根據其資料類型的常用輸出規則轉換為文字,然後根據格式指定符進行格式化並插入到結果字串中。

格式指定符以 % 字元開頭,並具有以下形式:

%[position][flags][width]type

其中各個欄位為:

position(可選)

一個 n$ 形式的字串,其中 n 是要列印的引數的索引。索引 1 表示 formatstr 之後的第一個引數。如果省略 position,則預設為使用序列中的下一個引數。

flags(可選)

控制格式指定符輸出格式的其他選項。 目前唯一支援的旗標是減號(-),它會使格式指定符的輸出靠左對齊。 除非同時指定了 width 欄位,否則此旗標無效。

width(可選)

指定用於顯示格式指定符輸出的最小字元數。 輸出會在左側或右側(取決於 - 旗標)填充空格,以達到所需的寬度。 過小的寬度不會導致輸出被截斷,而是會被忽略。 寬度可以使用以下任何一種方式指定:正整數、星號(*)以使用下一個函數引數作為寬度,或 *n$ 形式的字串以使用第 n 個函數引數作為寬度。

如果寬度來自函數引數,則該引數會在用於格式指定符值的引數之前被消耗。 如果寬度引數為負數,則結果會在長度為 abs(width) 的欄位中靠左對齊(如同指定了 - 旗標)。

type(必填)

用於產生格式指定符輸出的格式轉換類型。 支援以下類型:

  • s 將引數值格式化為簡單字串。 空值被視為空字串。

  • I 將引數值視為 SQL 識別符,必要時用雙引號括起來。 值為空值是錯誤的(相當於 quote_ident)。

  • L 將引數值引用為 SQL 常值。 空值顯示為字串 NULL,不帶引號(相當於 quote_nullable)。

除了上述格式指定符之外,特殊序列 %% 可用於輸出常值 % 字元。

以下是一些基本格式轉換的範例:

SELECT format('Hello %s', 'World');
Result: Hello World

SELECT format('Testing %s, %s, %s, %%', 'one', 'two', 'three');
Result: Testing one, two, three, %

SELECT format('INSERT INTO %I VALUES(%L)', 'Foo bar', E'O\'Reilly');
Result: INSERT INTO "Foo bar" VALUES('O''Reilly')

SELECT format('INSERT INTO %I VALUES(%L)', 'locations', 'C:\Program Files');
Result: INSERT INTO locations VALUES('C:\Program Files')

以下是使用 width 欄位和 - 旗標的範例:

SELECT format('|%10s|', 'foo');
Result: |       foo|

SELECT format('|%-10s|', 'foo');
Result: |foo       |

SELECT format('|%*s|', 10, 'foo');
Result: |       foo|

SELECT format('|%*s|', -10, 'foo');
Result: |foo       |

SELECT format('|%-*s|', 10, 'foo');
Result: |foo       |

SELECT format('|%-*s|', -10, 'foo');
Result: |foo       |

這些範例展示了 position 欄位的使用:

SELECT format('Testing %3$s, %2$s, %1$s', 'one', 'two', 'three');
Result: Testing three, two, one

SELECT format('|%*2$s|', 'foo', 10, 'bar');
Result: |       bar|

SELECT format('|%1$*2$s|', 'foo', 10, 'bar');
Result: |       foo|

與標準 C 函數 sprintf 不同,PostgreSQLformat 函數允許在同一個格式字串中混合使用帶有和不帶有 position 欄位的格式指定符。 沒有 position 欄位的格式指定符始終使用消耗的最後一個引數之後的下一個引數。 此外,format 函數不要求所有函數引數都必須在格式字串中使用。 例如:

SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three');
Result: Testing three, two, three

%I%L 格式指定符對於安全地建構動態 SQL 語句特別有用。 請參閱 範例 41.1

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格報告文件問題。