2016-12-02 2 views
0

를 사용할 때, 나는 형식 불일치 오류를 받고 있어요 사이에 유형 불일치를 주장 :BigQuery를 다음과 ELSE 내가이 쿼리를 실행하면 CASE

SELECT 
    date, 
    countA, 
    countB, 
    CASE 
    WHEN countA>0 then countB/countA 
    ELSE 0.0 
    END as ratioBA, 
    CASE 
    WHEN (countB>0 and countA>0) 
     THEN SQRT((1/FLOAT(countA))+(1/FLOAT(countB))) 
    WHEN (countB>0 and (countA<0 OR countA IS NULL)) 
     THEN SQRT(1.0+(1/FLOAT(countB))) 
    WHEN (countA>0 and (countB<0 OR countB IS NULL)) 
     THEN SQRT((1/FLOAT(countA))+1.0) 
    ELSE NULL 
    END as rel_unc_ratioBA 
FROM TABLE_DATE_RANGE([project:dataset.tablename_], TIMESTAMP('2015-01-01'), CURRENT_TIMESTAMP()) 
ORDER BY date ASC 

문제는 rel_unc_ratioBA 계산 CASE 문 것 같다. Error: CASE expects THEN and ELSE expressions to have similar types, but got different type double from ELSE expression which is not compatible with type int64.

countBcountA 약 1000 0이 될 수 있습니다, 또는 NULL이 될 수 정수 수가 있습니다

는 오류입니다.

나는 SQRT()이 float 유형을 반환한다고 생각 했으므로 이런 일이 일어나지 않아야합니다. 형식을 강제로 FLOAT() 안에 넣어 시도했지만이 작동하지 않습니다.

나는 또한 내가 정말 원하는 게 아니에요 비록

ELSE 0.0 

ELSE NULL 

를 교체했는데, 그 중 하나가 작동하지 않았다.

아이디어가 있으십니까?

+0

은 문제를 재현 할 수 없습니다. 일부 데이터 샘플을 제공하고 싶을 수도 있습니다. –

+0

좋습니다. 시도해 보겠습니다. 그게 독점 데이터가 아니라는 것은 쉬운 일이 아닙니다.하지만 이것은 이미 유용합니다. 쿼리가 아닌 데이터가있는 것으로 보입니다. – RKD314

+0

실제 데이터를 공유해서는 안됩니다. 그러나 이상적으로는이 오류를 그대로 재현 한 글자 그대로 (5 ~ 10) 행으로 데이터를 좁혀 야합니다. 이 다음에 필요한 경우 obfuscating 후 공유하는 예제가 될 것이라고 –

답변

1

BigQuery 레거시 SQL은 standard SQL보다 형식 강제 변환이 덜 일관된 의미를가집니다.

SELECT 
    CASE WHEN x = 1 THEN y ELSE z END 
FROM (SELECT 1 AS x, CAST(2 AS INTEGER) AS y, 3.14 AS z); 

이 제공 :

CASE expects THEN and ELSE expressions to have similar types, but got different type double from ELSE expression which is not compatible with type int64. 

당신은 UI에서 "표시 옵션"에서 "사용 레거시 SQL"을 선택 해제하고 실행하는 경우 예를 들어, 기존의 SQL을 사용하여 다음과 같은 쿼리를 실행 시도 할 수 있습니다

SELECT 
    CASE WHEN x = 1 THEN y ELSE z END 
FROM (SELECT 1 AS x, CAST(2 AS INT64) AS y, 3.14 AS z); 

F : 쿼리 다시 (같은 유형의 다른 이름)을 INTEGERINT64로 변경 한 후,하지만 당신은 2의 결과를 얻을 것이다

SELECT 
date, 
countA, 
countB, 
CASE 
    WHEN countA > 0 THEN countB/countA 
    ELSE 0.0 
END as ratioBA, 
CASE 
    WHEN (countB > 0 AND countA > 0) 
    THEN SQRT((1/countA) + (1/countB)) 
    WHEN (countB > 0 AND (countA < 0 OR countA IS NULL)) 
    THEN SQRT(1 + (1/countB)) 
    WHEN (countA > 0 AND (countB<0 OR countB IS NULL)) 
    THEN SQRT((1/countA) + 1) 
    ELSE NULL 
END as rel_unc_ratioBA 
FROM `project.dataset.tablename_` 
WHERE _PARTITIONTIME >= '2015-01-01' 
ORDER BY date ASC; 

기존 표준 SQL의 차이점에 대한 자세한 내용은 migration guide를 참조하십시오 또는 특정 쿼리에, 당신은 같은 표준 SQL을 사용하여 표현 할 수 있어야한다.

+0

나는이 대답의 맨 위에는 INT64 때문에 레거시 SQL을 준수하지 않는다고 생각합니다. 그래서 그것은 단지 INTEGER 여야합니다. 나는 틀릴 수있다 : o) –

+0

지금 투표 : o) –

+0

아 맞다. 왜 아직도 레거시 SQL에서 'INTEGER'라고 불리는 지 잘 모르겠습니다.) –