すべてのプロダクト
Search
ドキュメントセンター

PolarDB:prefix

最終更新日:Nov 07, 2024

prefixは、PolarDB for PostgreSQL でサポートされ、文字列プレフィックスの照合に使用されるサードパーティの拡張です。

前提条件

この拡張機能は、次のバージョンのPolarDB for PostgreSQLクラスターでサポートされています。

リビジョンバージョンが14.10.18.0以降のPostgreSQL 14

説明

次のステートメントを実行して、PolarDB for PostgreSQLクラスターのリビジョンバージョンを照会できます。

SELECT version();

背景情報

文字列プレフィックスマッチング機能は、一般的なビジネス機能です。 たとえば、テレフォニーアプリケーションでは、指定された電話番号のプレフィックスを入力するときに、指定された電話番号のプレフィックスに一致する電話番号の完全なリストを取得したい場合があります。 PolarDB for PostgreSQL では、prefix拡張機能を使用して文字列プレフィックスマッチング機能を実装できます。 次の例では、最長プレフィックスを一致させる方法について説明します。

SELECT *
    FROM prefixes
    WHERE prefix @> '0123456789'
ORDER BY length(prefix) DESC
    LIMIT 1;

プレフィックス拡張の使用

プレフィックス拡張の作成

CREATE EXTENSION prefix;

テーブルとインデックスの作成

CREATE TABLE prefixes (
        prefix    prefix_range PRIMARY KEY,
        name      TEXT NOT NULL,
        shortname TEXT,
        status    CHAR DEFAULT 'S',

        CHECK( status IN ('S', 'R') )
);
COMMENT ON COLUMN prefixes.status IS 'S:   - R: reserved';

INSERT INTO prefixes (prefix, name, shortname) VALUES
('010001','COLT TELECOMMUNICATIONS FRANCE','COLT'),
('010002','EQUANT France','EQFR'),
('010003','NUMERICABLE','NURC');

CREATE INDEX idx_prefix ON prefixes USING gist(prefix);

指定されたプレフィックスの一致

SELECT '123'::prefix_range @> '123456';
 ?column?
----------
 t
(1 row)
SELECT * FROM prefixes WHERE prefix @> '01000123';
 prefix |              name              | shortname | status
--------+--------------------------------+-----------+--------
 010001 | COLT TELECOMMUNICATIONS FRANCE | COLT      | S
(1 row)

サポートされる演算子

prefix拡張は、次の通常の演算子 <=<=<>>=> などの一連の演算子を提供します。 演算子は、文字列比較演算子と同じ意味を持ちます。 拡張機能は、@> (include) 、<@ (included) 、&& (overlap) 、| (union) 、および & (intersection) の演算子も提供します。

SELECT a, b,
       a <= b AS "<=", a < b AS "<", a = b AS "=", a <> b AS "<>", a >= b AS ">=", a > b AS ">",
       a @> b AS "@>", a <@ b AS "<@", a && b AS "&&"
   FROM (SELECT a::prefix_range, b::prefix_range
         FROM (VALUES('123', '123'),
                         ('123', '124'),
                         ('123', '123[4-5]'),
                         ('123[4-5]', '123[2-7]'),
                         ('123', '[2-3]')) AS t(a, b)) AS x;
    a     |    b     | <= | < | = | <> | >= | > | @> | <@ | &&
----------+----------+----+---+---+----+----+---+----+----+----
 123      | 123      | t  | f | t | f  | t  | f | t  | t  | t
 123      | 124      | t  | t | f | t  | f  | f | f  | f  | f
 123      | 123[4-5] | t  | t | f | t  | f  | f | t  | f  | t
 123[4-5] | 123[2-7] | f  | f | f | t  | t  | t | f  | t  | t
 123      | [2-3]    | t  | t | f | t  | f  | f | f  | f  | f
(5 rows)
SELECT a, b, a | b AS UNION, a & b AS INTERSECT
   FROM (SELECT a::prefix_range, b::prefix_range
         FROM (VALUES('123', '123'),
                         ('123', '124'),
                         ('123', '123[4-5]'),
                         ('123[4-5]', '123[2-7]'),
                         ('123', '[2-3]')) AS t(a, b)) AS x;
    a     |    b     |  union   | intersect
----------+----------+----------+-----------
 123      | 123      | 123      | 123
 123      | 124      | 12[3-4]  |
 123      | 123[4-5] | 123      | 123[4-5]
 123[4-5] | 123[2-7] | 123[2-7] | 123[4-5]
 123      | [2-3]    | [1-3]    |
(5 rows)