1

最長のプレフィックス一致のためにPostgreSQLで正確で高速なクエリを取得するための最良の方法は何ですか?

それは...ですか:

A。)select * from table where column in(subselect);

B.)strpos(column、column2)=1であるテーブルから*を選択します
    長さで並べ替え(column2)desc limit 1;

C.)select * from table where column〜column2
    長さ順(column2)説明制限1

アップデートで使用する予定です。何か案は?

4

1 に答える 1

0

PostgreSQLでこれをすぐに実行できる関数を知りません。再帰CTEは、かなり洗練されたソリューション(PostgreSQL 8.4以降で利用可能)の重要な要素になります

filterフィルタ文字列を保持するテーブルを想定しています。

CREATE TABLE filter (f_id int, string text);

tblそして、最長の一致を検索するテーブル:

CREATE TABLE tbl(t_id int, col text);

クエリ

WITH RECURSIVE
     f AS (SELECT f_id, string, length(string) AS flen FROM filter)
    ,t AS (SELECT t_id, col, length(col) AS tlen FROM tbl)
    ,x AS (
    SELECT t.t_id, f.f_id, t.col, f.string
          ,2 AS match, LEAST(flen, tlen) AS len
    FROM   t
    JOIN   f ON left(t.col, 1) = left(f.string, 1)

    UNION ALL
    SELECT t_id, f_id, col, string, match + 1, len
    FROM   x
    WHERE  left(col, match) = left(string, match)
    AND    match <= len
    )
SELECT DISTINCT
       f_id
      ,string
      ,first_value(col) OVER w AS col
      ,first_value(t_id) OVER w AS t_id
      ,(first_value(match) OVER w -1) AS longest_match
FROM   x
WINDOW w AS (PARTITION BY f_id ORDER BY match DESC)
ORDER  BY 2,1,3,4;

この関連する回答で、最終的なSELECTがどのように機能するかについての詳細な説明。
sqlfiddleでの作業デモ。

同じ長さの一致のセットからどの一致を選択するかを定義していません。私はネクタイから任意の勝者を1人選びます。

アップデートで使用する予定です。

PostgreSQL 9.1ではデータ変更CTEが導入されたため、これをUPDATEステートメントで直接使用できます。

于 2012-06-01T16:06:17.543 に答える