FLinksql 用if函数 需要将 NULL 赋值给一个字段,然后写入表,但报语法错误 强制使用NULL。版本:flink-1.13 请问类似需求该怎么规避或解决呢? org.apache.calcite.sql.validate.SqlValidatorException: Illegal use of 'NULL'
Flink SQL支持if函数,可以根据条件返回不同的值。if函数的语法是:
if(condition, true_value, false_value)
如果condition为true,返回true_value;如果condition为false,返回false_value;如果condition为null,返回null。
如果您需要将null赋值给一个字段,可以直接使用null作为true_value或false_value。例如:
if(product = 'rubber', null, amount)
这个表达式表示如果product等于’rubber’,返回null;否则返回amount。
如果您遇到语法错误,可能有以下几种原因:
1、您的Flink版本不支持if函数。请检查您的Flink版本是否是1.12或更高的版本,因为if函数是在1.12版本中引入的。
2、您的true_value或false_value的数据类型和字段的数据类型不匹配。请检查您的数据类型是否一致,或者使用cast函数进行转换。
3、您的condition中包含了无效的表达式。请检查您的condition是否符合SQL语法规则,或者使用其他函数替代。
以下是一个使用if函数将null赋值给一个字段,并写入表的示例:
-- 创建一个源表
CREATE TABLE Orders (
`user` BIGINT,
product STRING,
amount INT
) WITH (...);
-- 创建一个结果表
CREATE TABLE RubberOrders (
product STRING,
amount INT
) WITH (...);
-- 使用if函数将null赋值给amount字段,并写入结果表
INSERT INTO RubberOrders
SELECT product, if(product = 'rubber', null, amount) FROM Orders;
在使用IF函数进行赋值时,可以将要赋的值作为expr1或expr2,如果该字段为NULL,则IF函数会返回NULL,不会报错。
我举个例子参考下:
-- 将源表的数据插入到目标表中,并将status字段赋值为'ok'或NULL
INSERT INTO target_table
SELECT id, name, age, IF(age > 18, 'ok', NULL) AS status
FROM source_table;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。