2017-03-06 6 views
0

私は多くのバリアントを持つ製品テーブルを持っています。バリアントテーブルはhstoreデータ型の価格列を持っています。PostgreSQL hstoreのクエリ

最初のクエリは、2番目のクエリは完全に正常に動作し、エラーメッセージERROR: invalid input syntax for integer: "not a valid number"で失敗している間、私は2つのクエリ

クエリ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) 

を持っています。

+1

あなたの 'price - > 'sg''フィールドに数字ではなく、その結合でカバーされていない1つ以上の行にもあるものがあるようです。しかし、あなたのデータについてもっと知ることなく、それはちょうど推測です。 – jmelesky

答えて

2

問題のあるデータを見つける方法を解説しましょう。私はvariantsテーブルの行数が圧倒的に多いと仮定します。手動で数値以外の値を探すには十分な行が難しいでしょう。

最初に、ではない行を2番目のクエリでカバーされていないに分離しましょう。

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の1つ以上の行に、整数の不適切な内容、つまり"not a valid number"があります。クエリを実行して次のいずれかを確認します。

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