0

hstore 列を持つ 2 つのテーブルで左結合を実行しようとしています。

  SELECT
    d.context->'hostname' AS hostname,
    r.data->'Site' AS site,
    r.data->'Region' AS rack,
    r.data->'Manufacturer' AS vendor,
    r.data->'ModelNumber' AS model_number,
  FROM dns AS d
    LEFT JOIN rack AS r ON
        d.context->'hostname' ~ r.context->'Name'
  ;

dnsここで、との両方にrack2 つの hstore 列contextとがありdataます。左結合の条件はrack.context->'Name'、 fqdn'd の一部のみを含む可能性があるようなものですdns.context->'hostname'

ただし、上記を試すと、

 ERROR:  operator does not exist: text ~ hstore

何か案は?

4

1 に答える 1

2

優先順位の問題があります。これ:

d.context->'hostname' ~ r.context->'Name'

次のように解析されています。

d.context -> ('hostname' ~ r.context) -> 'Name'

そのため、 TEXT 値をHSTORE~と一致させようとしています。問題を強制するためにいくつかの括弧を追加します。'hostname'r.context

(d.context->'hostname') ~ (r.context->'Name')

operator precedence tableを見ると、次のように表示されます。

  • ~またはを含まないもの->
  • (any other): 他のすべてのネイティブおよびユーザー定義の演算子
  • ~またはを含まないより多くのもの->

したがって、両方とも~->その他」のカテゴリに分類されます。hstore拡張機能によって追加されるのに対し、ネイティブ演算子であるため、~前に演算子リストに追加されると思います。->~->


興味深いことに、含まれていない、~または->リストされていないものには LIKE が含まれており、これは次のとおりです。

hstore1 -> k1 like hstore2 -> k2

ここで期待どおりに動作します:

select 'a=>b'::hstore -> 'a' like 'a=>b'::hstore -> 'a';
select 'a=>b'::hstore -> 'a' ~    'a=>b'::hstore -> 'a';

最初のクエリは になりますが't'、2 番目のクエリでは「演算子が存在しません」というエラーが発生します。LIKESIMILAR、および~演算子はすべて同じテーマのバリエーションであるため、同じ優先順位を持つと予想していたため、これについてのみ言及します。

于 2013-04-22T17:45:18.000 に答える