2017-03-06 2 views
0

나는 많은 변형이있는 제품 테이블을 가지고 있습니다. 변형 테이블은 hstore 데이터 타입을 가진 가격 컬럼을 가지고 있습니다. 첫 번째 쿼리는 오류 메시지 ERROR: invalid input syntax for integer: "not a valid number" 두 번째 쿼리는 완벽하게 잘 작동 실패하는 동안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) 

있습니다.

+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%';