如何在高性能的select子句中转换表达式

时间:2017-03-13 14:22:13

标签: casting hana hana-sql-script

我有一个表,想要根据条件将十进制类型的列转换为整数。我需要尽可能地做到这一点。

我目前正在使用的查询如下所示: 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

一般情况下,可能存在大量“&#39;表达式(&gt; 100)。

  • 现在第一个问题是表达式很慢而且我需要提高性能所以我想知道它是否有可能像2 * to_int(col2 > y)一样快速转换,但我找不到办法此。
  • 第二个问题是当我遇到很多情况时,&#39;表达式然后我收到以下错误:SQL internal parse tree depth exceeds its maximum: parse tree depth exceeds its maximum:255

1 个答案:

答案 0 :(得分:0)

这里的用例不太确定。 一般而言,您不能同时为同一列使用不同的数据类型。这是关系数据模型的基本约束。

但是,如果要求仅仅是要有“C_CUSTKEY中的值<20”的指示符,则使用CASE语句是一种直接的方法。 为了避免在查询时进行此评估,您可以为此创建计算列。

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

关于语法错误:嗯,你只是没有使用正确的语法。请查看上面的示例,了解正确工作的示例。