使用iff函数修改十进制列中特定值的正确语法咨询
使用iff函数修改十进制列中特定值的正确语法咨询
嘿,我明白你现在的困扰——明明逻辑上没问题,却因为类型不匹配报错,好不容易调整了类型,结果目标值又没被替换成功,确实让人头疼。让我帮你梳理下问题和解决方案:
首先,你遇到的第一个错误「@then data type (long) must match the @else data type (decimal)」是因为你直接写的0是整数类型,而原列TreatmentDelay是十进制(decimal)类型,两个分支返回值类型必须完全一致才行。
而你尝试用todecimal转换后没生效,大概率是因为十进制的精度匹配问题:比如你的TreatmentDelay列可能是带小数位的(比如-1.000),而你转换的todecimal(-1)是-1.0,在严格类型比较下这两个值会被判定为不相等,所以替换逻辑没触发。
给你几个靠谱的解决方案,任选其一就行:
方案1:直接使用带小数的字面量匹配
直接用十进制形式的-1.0和0.0,确保和原列类型完全一致:
NewTreatmentDelay = iff(TreatmentDelay == -1.0, 0.0, TreatmentDelay)
方案2:严格指定十进制精度
如果你的列有固定的小数位数(比如保留6位),可以用DECIMAL函数明确指定精度,保证比较和返回值都和原列匹配:
NewTreatmentDelay = iff(TreatmentDelay == DECIMAL(-1, 18, 6), DECIMAL(0, 18, 6), TreatmentDelay)
这里的18是总位数,6是小数位数,你可以根据自己列的实际设置调整。
方案3:忽略小数位进行匹配
如果你的列里的-1可能带有不同的小数位(比如-1、-1.0、-1.00),可以先把值取整再比较:
NewTreatmentDelay = iff(ROUND(TreatmentDelay, 0) == -1, 0.0, TreatmentDelay)
这几个方法都能解决类型不匹配和值不替换的问题,你可以根据自己的数据情况选最合适的~
备注:内容来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

