我有以下构造函数(作为测试):
CREATE TABLE product (id BIGSERIAL PRIMARY KEY, ext hstore); CREATE INDEX ix_product_ext ON product USING GIN(ext); INSERT INTO product (id, ext) SELECT id, ('size=>' || CEILING(10 + RANDOM() * 90) || ',mass=>' || CEILING(10 + RANDOM() * 90))::hstore FROM generate_series(1, 100000) id;
我有以下查询,可以正常运行:
SELECT COUNT(id) FROM ( SELECT id FROM product WHERE (ext->'size')::INT >= 41 AND (ext->'mass')::INT <= 20 ) T
但我相信执行此操作的正确方法是使用@>运算符。我有以下内容,但它给出了语法错误:
SELECT COUNT(id) FROM ( SELECT id FROM product WHERE ext @> 'size>=41,mass<=20' ) T
我该怎么写呢?
阅读hstore文档(您的(最后一个查询))size>=41并不意味着“当大小大于或等于41时”:
size>=41
text => text make single-pair hstore
之后,您将无法编写mass<=20,因为没有这样的操作。使用@>运算符:
mass<=20
@>
hstore @> hstore does left operand contain right?
你可以写:
SELECT count(id) FROM product WHERE ext @> 'size=>41,mass=>20';
但是,只需要尺寸等于41且质量等于20的这些产品。