2

ltreePostgresテーブルから特定のラベルを削除するには? 私はテーブルを持っていますか?

テスト テーブル:

CREATE TABLE tbl (sno int, path ltree, userid int);

INSERT INTO tbl (sno, path, userid)
VALUES
  (1, '123',             123)
, (2, '123.101',         123)
, (3, '123.101.103',     123)
, (4, '123.101.103.105', 123)
, (5, '123.101.103.107', 123)
, (6, '123.102.104.106', 123)
, (7, '123.102.104.108', 123)
, (8, '123.102.104',     123)
, (9, '123.102',         123);

a をクエリに渡して、テーブル内のuseridすべてから削除したいと考えています。pathたとえば、 を渡す101と、123.101.103として更新する必要があり123.103ます。

これを直接行うことは可能ですか?pathそれとも、パス置換機能を使用して更新しますか?

PHP から次の選択クエリを実行しようとしましたが、以下のエラーが返されます。同じクエリが phpPgAdmin で正しく機能する!?

クエリ:

$selectPathq=pg_query($con,"select path from myschema.test where path @ '101'")
             or die('could not connect: '. pg_last_error($con));

エラー:

could not connect:
ERROR: operator does not exist: myschema.ltree @ unknown at character 63
HINT: No operator matches the given name and argument type(s).
      You might need to add explicit type casts.
4

1 に答える 1

7

エラーを修正

データ型と関連機能を使用するには、追加のモジュールをインストールltreeする必要があります。ltree

デフォルトでは、追加のモジュールがスキーマにインストールされますpublic。の現在の設定にsearch_pathスキーマが含まれていない場合public、ltree演算子は見つかりません。エラーメッセージはこの方向を示唆しています。

ERROR: operator does not exist: myschema.ltree @ unknown at character 63 

確認するには、ltree演算子をスキーマ修飾します@

SELECT path FROM tbl WHERE path operator(public.@) '101';

今は動作しますか?
それが問題の根本である場合は、search_path適切に設定することもできます。確認する:

SHOW search_path;

設定:

SET search_path = public; -- add more schemas as needed

についてのマニュアルsearch_path

UPDATEパス

私があなたの質問を正しく読み、すべての行のパスから特定のアイテムを削除したい場合:

UPDATE tbl t
SET    path = nu.path
FROM  (
   WITH x AS (
      SELECT sno, path, index(path, '101') AS i
      FROM   tbl
      WHERE  path ~ '*.101.*'
      )
   SELECT sno
        , subpath(path, 0, i)
          || CASE WHEN nlevel(path) > i+1 THEN subpath(path, i+1)
                  ELSE '' END AS path
   FROM x
   ) nu
WHERE nu.sno = t.sno;

pathは型であるため、式ltreeの演算子は正規表現の一致演算子ではなく、特別なltree一致演算子であり、正しい用語は型であると見なされることに注意してください。これは、ラベルを含むすべてのラベルパスに一致します。)~path ~ '*.101.*'lquery101

これにより、ちょうどあった場所に空のパスが残ります101。これをトリガーに入れてAFTER DELETE、すべての行から特定のアイテムを削除できます。

于 2012-12-26T07:32:04.740 に答える