2017-03-13 1 views
0

테이블이 있으며 조건에 따라 decimal 유형의 열을 정수로 변환하려고합니다. 가능한 한 공연자로서 이것을해야합니다.고성능으로 select 절에 표현식을 변환하는 방법

내 현재 작업 쿼리는 다음과 같습니다 select *, (case when C_CUSTKEY < 20 then 1 else 0 end) as bit from TPCH.CUSTOMER

그러나 나는이 문제를 개선하기 위해 노력하고있어. 즉석에서 전환을 수행 할 수 있습니까? 이 같은 : select *, cast((C_CUSTKEY < 20) as integer) as bit from TPCH.CUSTOMER 심지어 같은 간단한 버전 : sql syntax error: incorrect syntax near "<"

업데이트 1

그래서 : select *, (C_CUSTKEY < 20) as bit from TPCH.CUSTOMER

는 상관없이 내가 무엇을 사용 기능, 난 항상 다음과 같은 오류를 얻을 더 나은 이해를 위해 내가하고 싶은 일의 실제 사용은 다음과 같습니다 :

select ((case when col1 < x then 1 else 0 end) + (case when col2 > y then 2 else 0 end)) as bitset from TPCH.CUSTOMER

일반적으로 많은 수의 '대/소문자'표현식 (> 100)이있을 수 있습니다.

  • 이제 첫 번째 문제는 표현이 매우 낮다는 내가 나는 그것의 가능한 경우 2 * to_int(col2 > y) 같은 플라이 떨어지게의 변환에 알고 싶어 있도록 성능을 개선하기 위해 필요하지만이 작업을 수행 할 수있는 방법을 찾을 수 없습니다 . 여기에 사용 사례에 대한 SQL internal parse tree depth exceeds its maximum: parse tree depth exceeds its maximum:255

답변

0

아주 확실하지 : 나는 식은 후 나는 다음과 같은 오류가 많은 '사건'이있을 때

  • 두 번째 문제입니다. 일반적으로 동일한 열에 대해 동시에 다른 데이터 형식을 사용할 수 없습니다. 이것은 관계형 데이터 모델의 근본적인 제약입니다.

    그러나 요구 사항에 "value in C_CUSTKEY < 20"이라는 표시기가있는 경우 CASE 문을 사용하는 것이 간단합니다. 쿼리시이 평가를 피하기 위해이 계산 된 열을 만들 수 있습니다.

    alter table TPCH.CUSTOMER add ("BIT" integer 
               generated always as 
               case 
                when ("C_CUSTKEY" < 20) 
                then 1 
                else 0 
               end); 
    

    구문 오류에 관해서 : 음, 올바른 구문을 사용하고 있지 않습니다. 위의 예제에서 올바르게 작동하는 예제를 확인하십시오.

  • +0

    내가 현재하고있는 것이지만 실제로 BIT 열을 구체화하고 싶지는 않습니다. 또한 (field Jan

    +0

    @Jan 내가 게시 한 예는 게시 된 SPS11에서 작동합니다. 구체화하고 싶지 않으면 select 명령의 투영 부분에서 대소 문자를 사용하십시오. –

    +0

    그래서 질문에 썼다는 뜻인가요? 그건 내 목적이 너무 느리다. 'case when'표현의 성능을 향상시켜야합니다. ("C_CUSTKEY"> 40) then 2 else 0 end) + ...'''더 많은 것을 가진'''("C_CUSTKEY"<20) then then else 0 end) '표현이 매우 느릴 때. – Jan

    관련 문제