在Postgresql hstore中查询

时间:2017-03-06 17:01:15

标签: sql postgresql hstore

我有一个产品表有很多变种,变种表有一个带有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"时,第二个查询完全正常。

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

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