postgres在hstore上使用正则表达式离开了联接?

时间:2013-04-22 17:25:39

标签: regex postgresql left-join hstore

我正在尝试使用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

任何想法?

1 个答案:

答案 0 :(得分:2)

您有优先权问题。这样:

d.context->'hostname' ~ r.context->'Name'
正在解析

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

因此~正在尝试将'hostname' TEXT值与r.context HSTORE匹配。添加一些括号以强制解决问题:

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