在 Postgresql hstore 中查询
Querying inside Postgresql hstore
我有一个产品 table,它有很多变体,变体 table 有一个 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"
,但第二个查询运行良好。
一行或多行variants
的整数内容不正确,即"not a valid number"
。 运行 要检查哪些的查询:
select *
from variants
where price->'sg' like 'not%';
根据我的评论,让我们弄清楚如何找到有问题的数据。我假设您在 variants
table 中有大量的行 - 足够多的行手动查找非数字值将很困难。
首先,让我们分离出第二个查询未覆盖的行。
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]';
那应该列出未加入的项目,其中包括字符串中的非数字。清理这些,您的第一个查询应该可以工作。
我有一个产品 table,它有很多变体,变体 table 有一个 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"
,但第二个查询运行良好。
一行或多行variants
的整数内容不正确,即"not a valid number"
。 运行 要检查哪些的查询:
select *
from variants
where price->'sg' like 'not%';
根据我的评论,让我们弄清楚如何找到有问题的数据。我假设您在 variants
table 中有大量的行 - 足够多的行手动查找非数字值将很困难。
首先,让我们分离出第二个查询未覆盖的行。
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]';
那应该列出未加入的项目,其中包括字符串中的非数字。清理这些,您的第一个查询应该可以工作。