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

MaxCompute这个正则一直报这个错,该怎么处理?

select case when regexp_extract(a,'^[0-9]+[.]?[0-9]*|[.][0-9]+)$') then a else 0 end ast from xxx

semantic analysis exception - invalid condition type string,except Boolean for case without value。这个正则一直报这个错,该怎么处理?

展开
收起
冰激凌甜筒 2023-04-19 10:43:14 355 0
18 条回答
写回答
取消 提交回答
  • 根据您提供的 SQL 语句和错误信息,问题可能出现在 case when 语句中。您的 case when 语句缺少一个 else 子句的值,这可能导致语法分析错误。

    您可以尝试修改您的 SQL 语句,添加一个 else 子句的值,例如:

    select case when regexp_extract(a,'^[0-9]+[.]?[0-9]*|[.][0-9]+)$') then a else '0' end ast from xxx
    

    在这个例子中,我将 else 子句的值更改为字符串 '0'。如果您希望返回数字类型的值,可以将 else 子句的值更改为数字类型的值。

    2023-05-31 11:12:40
    赞同 展开评论 打赏
  • 无所不能的蛋蛋

    该错误是因为在 CASE WHEN 语句中的条件类型不正确,应该是布尔类型而不是字符串类型。

    在这个例子中,您提供的正则表达式应该用于确定列 a 中的数据类型。但是,您在 CASE WHEN 语句中使用了该正则表达式,但并没有将其转换为布尔类型。

    正确的方式是使用正则表达式在 SELECT 语句中为字段 a 分配一个布尔值,然后使用布尔条件值在 CASE WHEN 语句中进行条件测试。即使要根据正则表达式将列 a 转换为数字,也应该首先使用 SELECT 中的正则表达式将其分配为布尔类型的值,然后再在 CASE WHEN 语句中将其转换为数字。

    下面是一个示例 SQL 语句,可以使用类似的 ALTER TABLE 语句重命名列名以增加可读性,特别是在使用正则表达式检查可选列的数据类型时:

    select case when regexp_extract(a, '^[0-9]+[.]?[0-9]*|[.][0-9]+)$') is not null then cast(a as double) else 0 end as a_renamed
    from xxx;
    

    这个例子在 SELECT 语句中使用了正则表达式获取 a 列的类型,并检查该正则表达式是否匹配成功,如果成功,将 a 列转换为 double 类型。如果不成功,则将其转换为整数类型 0。

    注意,我们没有使用 THEN 子句来传递 test_result 的值,而是使用的是 CAST(a as double)。另外,需要将正则表达式的括号放在字符集方括号 [ ] 内部,而不是在外部,才能实现从字符串向布尔值转换的正确性。

    2023-05-27 10:38:24
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    根据错误提示,这个sql语句中case语句的条件类型错误。case语句的条件应该是一个boolean类型的表达式,而这个正则表达式的类型不是boolean。因此,需要对正则表达式进行修改,以使其返回一个boolean类型的值。

    可以尝试将原来的正则表达式改为以下形式:

    SELECT CASE WHEN a REGEXP '^[0-9]+(\.[0-9]*)?$' THEN a ELSE 0 END AS ast FROM xxx
    

    这个正则表达式可以匹配整数或小数,如果匹配成功,则返回a本身,否则返回0。修改完成后,再次运行查询,应该不会报错了。

    2023-05-26 16:50:18
    赞同 展开评论 打赏
  • 从事java行业8年至今,热爱技术,热爱以博文记录日常工作,csdn博主,座右铭是:让技术不再枯燥,让每一位技术人爱上技术

    你好,根据你的错误提示来看是case when表达式需要一个boolean类型的value,但是你的sql中case when表达是返回的是一个string类型的value,建议你根据具体的业务逻辑调整一下,另外REGEXP_EXTRACT函数将字符串source按照pattern的分组规则进行字符串匹配,返回第groupid个组匹配到的字符串内容,是string类型返回的哈,不是boolean类型。

    2023-05-22 18:37:35
    赞同 展开评论 打赏
  • 在 MaxCompute 的 SQL 语句中,CASE WHEN 语句的条件判断必须是一个 Boolean 类型的表达式,而你所提供的 CASE WHEN 语句中,条件判断使用了一个正则表达式,这个正则表达式是一个字符串类型的表达式,因此导致了该错误的提示。

    要解决这个问题,可以将正则表达式作为一个子查询单独执行,并使用 EXISTS 或者 IN 等语法来替代 CASE WHEN 语句中的条件判断,例如:

    SELECT IF(EXISTS (SELECT * FROM xxx WHERE regexp_extract(a,'^[0-9]+[.]?[0-9]*|[.][0-9]+)$')), a, 0) AS ast FROM xxx;
    

    上述示例中,使用子查询执行了正则表达式的匹配,并通过 EXISTS 语句判断结果是否存在。如果存在则输出字段 a 的值,否则输出 0。同时使用 IF 函数来将查询结果转换为指定格式。

    同时需要注意的是,使用正则表达式来进行条件判断,需特别留意正则表达式的正确性,以防止查询结果的异常。如果出现查询结果异常的情况,需要针对具体情况进行排查和调试。

    2023-05-19 09:08:00
    赞同 展开评论 打赏
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。

    要修正这个错误,可以如下处理: 1. 使用REGEXP_LIKE()函数替代正则表达式 REGEXP_LIKE()会返回布尔值,可以直接在CASE表达式的WHEN子句中使用: sql SELECT CASE WHEN REGEXP_LIKE(a, '^[0-9]+[.]?[0-9]|[.][0-9]+)$') THEN a ELSE 0 END AS a FROM ... 2. 使用IF()函数进行条件判断 可以使用IF()函数先判断正则表达式匹配结果是否为空,如果不为空(true),再在CASE表达式中使用该值: sql SELECT CASE WHEN IF(REGEXP_EXTRACT(a, '^[0-9]+[.]?[0-9]|[.][0-9]+)$') THEN a ELSE 0 END AS a FROM ... 3. 提取正则表达式为中间值,在CASE表达式中引用 可以首先使用正则提取 intermediate 值,然后在CASE表达式中判断intermediate是否为空来使用a的值: sql intermediate = REGEXP_EXTRACT(a, '^[0-9]+[.]?[0-9]*|[.][0-9]+)$') SELECT
    CASE WHEN intermediate IS NOT NULL THEN a ELSE 0 END AS a FROM ...

    2023-05-18 16:10:16
    赞同 展开评论 打赏
  • 云端行者觅知音, 技术前沿我独行。 前言探索无边界, 阿里风光引我情。

    错误信息,可以看出是语法错误导致的。按照你的语句我修改了下,是可以执行的。你可以试试。

    select case when regexp_extract(a,'^[0-9]+[.]?[0-9]*|[.][0-9]+$') then a else '0' end ast from xxx

    在这个SQL语句中,我将CASE语句的THEN子句中的值修改为了字符串'0',以保证语法正确。

    2023-05-18 13:51:23
    赞同 展开评论 打赏
  • 这个错误提示是因为在使用SELECT CASE WHEN语句时,WHEN后面的条件需要返回一个Boolean类型的值,而正则表达式匹配函数regexp_extract返回的是一个String类型的值,因此需要将其转换为Boolean值才能使用。您可以使用正则表达式函数regexp_like来替换regexp_extract,regexp_like可以直接返回Boolean类型,可以解决这个问题。修改后的语句如下所示:

     
    
    SELECT CASE WHEN regexp_like(a, '^[0-9]+[.]?[0-9]*|[.][0-9]+$') THEN a ELSE 0 END ast FROM xxx;
    

    在上述语句中,使用regexp_like函数替换了regexp_extract函数,并将正则表达式的模式作为第一个参数传递给函数。这样就可以得到一个Boolean类型的值,用于作为SELECT CASE WHEN语句中的条件。

    2023-05-17 23:39:14
    赞同 展开评论 打赏
  • 可以看出问题出在正则表达式的条件判断上。MaxCompute的CASE语句要求条件表达式返回的是布尔类型(BOOLEAN),但您的正则表达式条件返回的是字符串类型(STRING),导致出现了错误。

    2023-05-17 15:16:32
    赞同 展开评论 打赏
  • 这个错误提示表明您的MaxCompute SQL语句中的正则表达式有问题。具体来说,错误消息指出您的CASE语句中的条件类型无效,并且正则表达式没有正确设置。

    要解决这个问题,建议您按照以下步骤进行操作:

    检查正则表达式语法:首先,请确保您正在使用的正则表达式语法是正确的,并且符合MaxCompute SQL语言规范。例如,在您的示例中,您可以检查正则表达式是否正确设置,并且是否包含所需的转义字符和元字符。

    修复CASE语句错误:根据错误消息,您的CASE语句使用了无效的条件类型。具体来说,您需要在CASE语句中使用布尔类型的条件表达式(即true或false),而不是字符串类型的条件表达式。例如,您可以修改您的SQL代码如下:

    select case when regexp_extract(a,'^[0-9]+[.]?[0-9]*|[.][0-9]+)$') is not null then a else 0 end ast from xxx;

    在这里,我们使用“is not null”作为条件表达式,它将返回一个布尔值(true或false),以表示正则表达式是否匹配成功。

    进一步排查错误:如果以上步骤无法解决问题,请尝试进一步排查错误,并检查其他可能引起问题的因素。例如,您可以检查输入数据是否符合预期,并验证其他相关MaxCompute函数和语法是否正确。

    请注意,此外还有一些MaxCompute的限制和最佳实践,例如在使用正则表达式时要避免使用过于复杂的模式,并确保您的查询代码可读性强。如有必要,请参考MaxCompute官方文档或联系MaxCompute技术支持团队以获取更多帮助。

    2023-05-16 15:24:09
    赞同 展开评论 打赏
  • 正则表达式本身中也存在一些语法上的问题,导致解析无法正确匹配:

    1. 表达式中缺少左括号;
    2. 正则表达式中没有提供自动判断条件的结束符;
    3. 正则表达式中的顶级分隔符没有正确转义。

    基于这些原因,请尝试更新SQL查询并更正上述错误。以下是改进后的示例代码,供参考:

    sql
    SELECT CASE 
      WHEN REGEXP_EXTRACT(a,'^([0-9]+[.]?[0-9]*)$|([.][0-9]+)$') IS NOT NULL THEN a 
      ELSE '0' 
    END AS ast FROM xxx;
    
    

    改进方法包括:

    在正则表达式开头添加左括号,修改两个可选部分之间的逻辑运算符,以及添加右括号关闭默认的OR操作; 使用IS NOT NULL检查字符串模式是否匹配,并根据情况向ELSE子句返回默认值(此处我将“0”字符串用引号括起来)。

    2023-05-16 15:01:05
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    这个错误是由于正则表达式中的括号不匹配导致的。在你的正则表达式中,最后的括号没有与之对应的左括号,应该是一个左括号"(“,而不是右括号”)"。因此,你可以将正则表达式修改为:

    '^[0-9]+[.]?[0-9]*|[.][0-9]+)$' 这样就可以避免该错误了。同时,你的SQL语句中的CASE WHEN表达式也有问题,应该将ELSE子句中的0改为’0’,因为你的AST列是字符串类型。因此,你可以将SQL语句修改为:

    SELECT CASE WHEN REGEXP_EXTRACT(a, '^[0-9]+[.]?[0-9]*|[.][0-9]+$') THEN a ELSE '0' END AS ast FROM xxx; 这样就可以正确地使用正则表达式提取数据了。

    2023-05-16 15:00:24
    赞同 展开评论 打赏
  • 根据报错信息,可以看出问题出在case语句中。可能是因为在case语句中,没有正确的设置true和false的返回值。建议修改代码如下:

    select 
      case 
        when regexp_extract(a,'^[0-9]+[.]?[0-9]*[.][0-9]+)$') = a 
        then a 
        else '0' 
      end ast 
    from xxx
    
    

    当正则表达式匹配成功时,应该返回true,即a等于正则表达式提取出来的结果,否则返回false,即不等于正则表达式提取出来的结果。同时,为了避免类型不匹配的问题,false值需要用字符串'0'来代替。

    2023-05-16 14:42:12
    赞同 展开评论 打赏
  • 月移花影,暗香浮动

    这个错误是由于查询语句中的条件(Where子句)中的表达式类型不正确所导致的。具体来说,可能的原因包括:

    1. 条件中的字符串表达式中缺少单引号或双引号等分隔符;
    2. 条件表达式有语法错误;
    3. 没有使用正确的数据类型(例如,尝试将字符串类型的列与整数值进行比较)。

    针对这些问题,您可以尝试以下几种解决方法:

    1. 确保条件中使用了正确的语法,并使用适当的分隔符来表示字符串常量;
    2. 检查条件表达式的语法是否正确,可以尝试在命令行终端或其他工具中运行该查询语句并查看报错信息;
    3. 确保表达式所使用的数据类型是兼容的,例如可以使用CAST函数将字符串类型显式转换为数字类型等。

    您可以尝试以上方法解决该错误。

    2023-05-16 11:26:39
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在MaxCompute中,当使用CASE语句时,THEN子句和ELSE子句的返回值类型必须相同。根据你提供的SQL语句,可能是因为ELSE子句返回了数字0,而导致出现“invalid condition type string”的错误。因为ELSE子句返回的是数字,而不是Boolean类型。

    如果你想要实现的功能是:当a符合正则表达式,则返回a;否则返回0。可以将ELSE子句中的数字0改为字符型的'0',例如:

    select case when regexp_extract(a,'^[0-9]+[.]?[0-9]*|[.][0-9]+)$') then a else '0' end ast from xxx;
    

    这样做可以确保ELSE子句返回的也是字符串类型,与THEN子句中返回的字符串类型一致,从而避免出现“invalid condition type string”的错误。

    需要注意的是,上述语句中的正则表达式是否正确,还需要根据具体情况进行调整。

    2023-05-15 22:33:54
    赞同 展开评论 打赏
  • 技术架构师 阿里云开发者社区技术专家博主 CSDN签约专栏技术博主 掘金签约技术博主 云安全联盟专家 众多开源代码库Commiter

    这个错误提示是因为您在CASE WHEN语句中设置的条件表达式不合法。在MaxCompute中,CASE WHEN语句中的条件表达式必须返回一个布尔类型的值,表示真或假。

    根据您提供的SQL语句,我发现其中使用了正则表达式来匹配字符串,并将匹配结果作为条件进行判断。但是,在您给出的正则表达式中存在一些语法错误,导致无法正确解析,从而引起了错误提示。

    具体而言,正则表达式中的一些字符缺少闭合符号,例如右括号和引号等。此外,如果您想要使用正则表达式来匹配数字,建议使用\d+或\d*.\d+的形式,可以更加简洁和准确地匹配数字类型的字符串。

    因此,为了解决这个问题,您需要重新编写正则表达式,并确保其符合语法规范。例如,以下是一个比较简单的正则表达式示例,用于匹配以数字开头或以小数点开头的字符串:

    SELECT CASE WHEN REGEXP_LIKE(a, '^[0-9]+(\.[0-9]*)?$') THEN a ELSE 0 END AS ast FROM xxx;
    

    在上述代码中,我们使用REGEXP_LIKE()函数来匹配字符串。正则表达式'^[0-9]+(.[0-9]*)?$'用于匹配以数字开头或以小数点开头的字符串,其中.[0-9]*表示小数部分。

    需要注意的是,在使用正则表达式匹配字符串时,还需要考虑数据类型、编码等因素。如果您仍然无法解决问题,请提供更多信息以便我更好地帮助您。

    2023-05-15 17:33:56
    赞同 展开评论 打赏
  • 热爱开发

    您好,根据错误提示,这个问题似乎是由于case语句的语法出现了问题。在MaxCompute中,case语句的语法应该是:

    CASE expression WHEN value THEN result [WHEN ...] [ELSE else_result] END 其中expression是需要被判断的表达式,value是匹配的值,result是匹配成功后的返回结果,else_result是所有条件都不匹配时的默认返回结果。

    在您提供的SQL语句中,case语句中的表达式缺失,导致语法无效,因此报错。如果您想要对a进行正则匹配,并将匹配成功的结果返回,可以修改为以下语句:

    SELECT CASE WHEN regexp_extract(a, '^[0-9]+[.]?[0-9]*|[.][0-9]+') = a THEN a ELSE 0 END AS ast FROM xxx; 注意到这里,我们将表达式部分换成了正则匹配的结果,当正则匹配结果与a相等时,说明正则匹配成功,返回a本身,否则返回0。

    希望以上解答能够帮助到您,如有其他问题,欢迎提出。

    2023-05-15 17:30:36
    赞同 展开评论 打赏
  • 你所使用的正则表达式中存在语法错误。具体来说,这个错误是因为CASE函数中,ELSE语句中的值必须与THEN子句中的值具有相同的数据类型,而你的ELSE语句中的值是数字 0,与THEN子句中的字符串不对应,因此出现了语法错误。

    另外,你的正则表达式也存在一些问题。该正则表达式的意思是匹配以数字或小数点开头或以小数点结尾的字符串。然而,这个正则表达式的括号没有匹配到开头位置的左边括号,会导致语法错误。正确的正则表达式应该是:

    '^[0-9]+[.]?[0-9]*|[.][0-9]+$' 针对这个问题,你可以将ELSE语句中的值改为字符串'0',这样它就可以与THEN子句中的值匹配。另外,还需要修复你的正则表达式,以便正确地匹配字符串。

    下面是修正后的SQL语句:

    SELECT CASE WHEN REGEXP_EXTRACT(a, '^[0-9]+[.]?[0-9]*|[.][0-9]+$') THEN a ELSE '0' END AS ast FROM xxx; 注:以上正则表达式只能匹配非负数的情况,如果需要匹配负数,则需要进行相应修改。

    2023-05-15 16:46:23
    赞同 展开评论 打赏
滑动查看更多

MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。

相关产品

  • 云原生大数据计算服务 MaxCompute
  • 相关电子书

    更多
    大数据AI一体化的解读 立即下载
    极氪大数据 Serverless 应用实践 立即下载
    大数据&AI实战派 第2期 立即下载