2017-03-06 74 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%';