2017-03-13 3 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 たりなどの簡単なバージョンのために:このような何かに関係なく、私が使用しているものの機能 select *, (C_CUSTKEY < 20) as bit from TPCH.CUSTOMER

、私は常に次のエラーを取得: sql syntax error: incorrect syntax near "<"

を更新1

ので、理解しやすくするために、私がしたいことの実際の使用目的は以下の通りです:

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コマンドの投影部分のcase条件を使用してください。 –

    +0

    あなたは私が質問に書いたようにそれを意味するのですか?それは私の目的にとっては遅すぎます。私は、「事例」表現のパフォーマンスを改善する必要があります。 ( "C_CUSTKEY"> 40)、次に2 else 0 end)+ ... '' 'もっと多くの ' 「表現が非常に遅い場合には – Jan

    関連する問題