i有一个具有许多变体的产品表,变体表具有Hstore DataType的价格列。
我有两个查询
查询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"
第二查询工作正常。
在我的评论中构建,让我们弄清楚如何找到有问题的数据。我将假设您在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]';
应该列出未加入的项目,并且在字符串中包括非数字。清理这些问题,您的第一个查询应该起作用。
一排或多个variants
行的内容不正确,即"not a valid number"
。运行查询以检查哪些:
select *
from variants
where price->'sg' like 'not%';