★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 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

9.5. バイナリ文字列関数と演算子

本節ではbytea型の値を調べたり操作するための関数と演算子について説明します。

SQLでは、引数の区切りにカンマではなくキーワードを使う文字列関数を、いくつか定義しています。 詳細は表 9.11を参照してください。 またPostgreSQLは、これらの関数に対して通常の関数呼び出し構文を使用するバージョンを提供します(表 9.9を参照してください)。

注記

このページで示されるサンプル結果は、サーバパラメータであるbytea_outputescapeに設定されていることを想定しています(この設定はPostgreSQLの伝統的な形式です)。

表9.11 SQLバイナリ文字列関数と演算子

関数戻り値型説明結果
string || string bytea 文字列結合 '\\Post'::bytea || '\047gres\000'::bytea\\Post'gres\000
octet_length(string) intバイナリ文字列中のバイト数octet_length('jo\000se'::bytea)5
overlay(string placing string from int [for int]) bytea 部分文字列の置換 overlay('Th\000omas'::bytea placing '\002\003'::bytea from 2 for 3)T\\002\\003mas
position(substring in string) int指定した部分文字列の位置position('\000om'::bytea in 'Th\000omas'::bytea)3
substring(string [from int] [for int]) bytea 部分文字列の抽出 substring('Th\000omas'::bytea from 2 for 3)h\000o
trim([both] bytes from string) bytea 文字列stringの先頭および末尾からbytesに含まれるバイトのみを含む最長の文字列を削除します。 trim('\000\001'::bytea from '\000Tom\001'::bytea)Tom

この他、表 9.12に列挙するバイナリ列操作関数が使えます。 そのいくつかは、表 9.11で説明した標準SQLの文字列関数を実装するために内部的に使用されています。

表9.12 その他のバイナリ文字列関数

関数戻り値型説明結果
btrim(string bytea, bytes bytea) bytea bytesに含まれるバイトのみを有する最長の文字列をstringの先頭と末尾から削除します。 btrim('\000trim\001'::bytea, '\000\001'::bytea)trim
decode(string text, format text) bytea stringで表現されているテキストデータをバイナリデータに復号します。 formatのオプションはencodeと同じです。 decode('123\000456', 'escape')123\000456
encode(data bytea, format text) text バイナリデータをテキスト表現形式に符号化します。 サポートされている形式は、base64hexescapeです。 escapeは0のバイトと最上位ビットがセットされているバイトを8進数のシーケンス(\nnn)に変換し 、バックスラッシュを二重化します。 encode('123\000456'::bytea, 'escape')123\000456
get_bit(string, offset) int 文字列から1ビット抽出します。 get_bit('Th\000omas'::bytea, 45)1
get_byte(string, offset) int 文字列から1バイト抽出します。 get_byte('Th\000omas'::bytea, 4)109
length(string) int バイナリ文字列の長さ length('jo\000se'::bytea)5
md5(string) text stringのMD5のハッシュを計算し、結果を16進数で返します。 md5('Th\000omas'::bytea)8ab2d3c9689aaf18​b4958c334c82d8b1
set_bit(string, offset, newvalue) bytea 文字列内のビットを設定します。 set_bit('Th\000omas'::bytea, 45, 0)Th\000omAs
set_byte(string, offset, newvalue) bytea 文字列内の1バイトを設定します。 set_byte('Th\000omas'::bytea, 4, 64)Th\000o@as
sha224(bytea) bytea SHA-224ハッシュ sha224('abc')\x23097d223405d8228642a477bda2​55b32aadbce4bda0b3f7e36c9da7
sha256(bytea) bytea SHA-256ハッシュ sha256('abc')\xba7816bf8f01cfea414140de5dae2223​b00361a396177a9cb410ff61f20015ad
sha384(bytea) bytea SHA-384ハッシュ sha384('abc')\xcb00753f45a35e8bb5a03d699ac65007​272c32ab0eded1631a8b605a43ff5bed​8086072ba1e7cc2358baeca134c825a7
sha512(bytea) bytea SHA-512ハッシュ sha512('abc')\xddaf35a193617abacc417349ae204131​12e6fa4e89a97ea20a9eeee64b55d39a​2192992a274fc1a836ba3c23a3feebbd​454d4423643ce80e2a9ac94fa54ca49f

get_byteset_byteはバイナリ列の先頭バイトを0バイトとして数えます。 get_bitset_bitは各バイト内を右からビットを数えます。例えばビット0は先頭バイトの最下位ビットとなり、ビット15は第二バイトの最上位ビットとなります。

歴史的な理由により、md5は16進のエンコード値を返すのに対し、SHA-2関数はbyteaを返すことに注意してください。 両者の間の変換を行うには、関数encodedecodeを使ってください。たとえば、16進のエンコードのテキスト表現を得るには、encode(sha256('abc'),'hex')としてください。

9.20におけるstring_agg集約関数や35.4のラージオブジェクト関数も参照してください。