我有一个表,想要根据条件将十进制类型的列转换为整数。我需要尽可能地做到这一点。
我目前正在使用的查询如下所示:
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)
一样快速转换,但我找不到办法此。SQL internal parse tree depth exceeds its maximum: parse tree depth exceeds its maximum:255
答案 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);
关于语法错误:嗯,你只是没有使用正确的语法。请查看上面的示例,了解正确工作的示例。