我正在尝试使用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'
;
其中dns
和rack
都有两个hstore列context
和data
;左连接的条件是rack.context->'Name'
可能只包含fqdn'd dns.context->'hostname'
的一部分。
然而,当我尝试上述内容时,我得到了
ERROR: operator does not exist: text ~ hstore
任何想法?
答案 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'
,而第二个查询将产生“运算符不存在”错误。我之所以提到这一点,是因为我希望LIKE
,SIMILAR
和~
运算符具有相同的优先级,因为它们都是同一主题的变体。