0

我正在尝试对带有 hstore 列的两个表进行左连接:

  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'
  ;

其中dnsrack都有两个 hstore 列contextdata; 左连接的条件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'

所以~试图将'hostname'TEXT 值与r.contextHSTORE 匹配。添加一些括号来强制问题:

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

如果我们看一下运算符优先级表,你会看到:

  • 不包含~->
  • (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',而第二个查询将产生您的“操作员不存在”错误。我只提到这一点是因为我希望LIKE,SIMILAR~运算符具有相同的优先级,因为它们都是同一主题的变体。

于 2013-04-22T17:45:18.000 回答