开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

请问类似需求该怎么规避或解决呢?

FLinksql 用if函数 需要将 NULL 赋值给一个字段,然后写入表,但报语法错误 强制使用NULL。版本:flink-1.13 请问类似需求该怎么规避或解决呢? org.apache.calcite.sql.validate.SqlValidatorException: Illegal use of 'NULL'

展开
收起
JWRRR 2023-04-03 15:11:28 226 0
3 条回答
写回答
取消 提交回答
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    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;
    
    2023-04-23 23:14:01
    赞同 展开评论 打赏
  • 写个udf 处理下此回答整理自钉群“【③群】Apache Flink China社区”

    2023-04-03 16:48:37
    赞同 展开评论 打赏
  • 发表文章、提出问题、分享经验、结交志同道合的朋友

    在使用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;
    
    2023-04-03 16:17:56
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载