2017-03-06 71 views
0

我有一个产品表,它有许多变种,变种表有一个价格列与hstore数据类型。在Postgresql hstore中查询

我有两个查询

查询1

SELECT variants.* FROM variants WHERE (CAST(variants.price -> 'sg' AS INT) > 1000) 

查询2

SELECT products.* FROM products INNER JOIN variants ON variants.checkoutable_id = products.id AND variants.checkoutable_type = 'Product' WHERE (CAST(variants.price -> 'sg' AS INT) > 1000) 

虽然第一查询失败的错误消息ERROR: invalid input syntax for integer: "not a valid number"所述第二查询工作完全正常。

+1

听起来好像你在'价格 - >'sg''字段中有一些不是数字的东西,但也只有一行或多行没有被该连接覆盖。这只是一个猜测,但不知道更多关于你的数据。 – jmelesky

回答

2

关于我的评论,让我们弄清楚如何找到有问题的数据。我假设你在variants表中有大量的行 - 手动查找非数字值的行将会很困难。

首先,让我们隔离而不是由第二个查询覆盖的行。

SELECT * 
FROM variants 
WHERE 
    checkoutable_type != 'Product' OR 
    checkoutable_id NOT IN (SELECT id FROM products); 

这可能需要一段时间才能运行,只是一个大数据转储。我们真的只对price->'sg'感兴趣,特别是price->'sg'不是整数的字符串表示。

SELECT price->'sg' 
FROM variants 
WHERE 
    (checkoutable_type != 'Product' OR 
    checkoutable_id NOT IN (SELECT id FROM products)) AND 
    price->'sg' !~ '[0-9]'; 

这应该列出未加入的项目,其中包括字符串中的非数字。清理这些,你的第一个查询应该工作。

1

variants的一行或多行含有不正确的整数内容,即"not a valid number"。运行查询来检查哪些:

select * 
from variants 
where price->'sg' like 'not%';