0

我有一个表,想根据条件将十进制类型的列转换为整数。我需要尽可能高效地执行此操作。

我当前工作的查询如下所示: 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

通常可以有大量的“case when”表达式(>100)。

  • 现在第一个问题是表达式非常慢,我需要提高性能,所以我想知道它是否可以像这样进行即时转换,2 * to_int(col2 > y)但我找不到这样做的方法。
  • 第二个问题是当我有很多“case when”表达式时,我会收到以下错误:SQL internal parse tree depth exceeds its maximum: parse tree depth exceeds its maximum:255
4

1 回答 1

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);

关于语法错误:好吧,您只是没有使用正确的语法。检查上面的示例以获取正确工作的示例。

于 2017-03-14T00:15:24.423 回答