天天都在select 2024-04-15 15:30 采纳率: 42.9%
浏览 6

length函数返回错误长度

presto 中 length()函数 返回错误长度
在 直接将该值单独length 时,长度正确

select length(cast(3780000000 as varchar) )  

此时返回正确长度,10
但是放到整个sql 中时返回错误:

  select id,length(cast(round(value,0) as varchar))lenth,count(*)
  from table.table_name
  where id= '001' and  log_date >='20240408' and log_date <'20240415'
 and value > 20000000

此时返回长度为 7 ??
非常奇怪的结果,已经排查了空格,小数点等问题,还是无法解决

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-15 15:30
    关注

    引自免费微信小程序:皆我百晓生

    看起来您在Presto SQL查询中遇到了一个关于length()函数返回不正确结果的问题。这里有一个可能的原因:当您对数值进行四舍五入(round())操作后,它可能会转换成字符串类型,而这个字符串可能包含额外的前导零。尽管在某些情况下,round()函数会保留这些零,但在其他情况下,它可能会去掉它们。

    为了解决这个问题,您可以尝试先将值转换为字符串,然后再进行四舍五入。这样可以确保始终得到预期的字符串格式。以下是修改后的SQL查询:

    SELECT 
        id,
        LENGTH(CAST(value AS VARCHAR)) AS length,
        COUNT(*) 
    FROM 
        table.table_name 
    WHERE 
        id = '001' 
        AND log_date >= '20240408' 
        AND log_date < '20240415' 
        AND CAST(value AS VARCHAR) > '20000000' 
    GROUP BY 
        id;
    

    在这个版本中,我们首先将value列转换为VARCHAR,然后应用ROUND()函数。这应该确保无论value的原始类型如何,都会得到一个始终包含相同数量字符的字符串表示。

    如果您的数据集中有负数,您可能还需要考虑处理这种情况。在这种情况下,可以稍微调整一下条件语句:

    AND (CAST(value AS VARCHAR) + '-') > '-' || '20000000'
    

    这样可以确保负数也被正确处理。

    请注意,上述查询假设log_date是日期类型,如果不是,您可能需要将其转换为日期类型。如果仍然有问题,请检查表结构和数据样例,确认所有输入都是预期的。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月15日

悬赏问题

  • ¥15 Arduino电机和openmv连接异常
  • ¥15 Arcgis河网分级报错
  • ¥200 java+appium2.1+idea
  • ¥20 请帮我做一个EXE的去重TXT文本
  • ¥15 工价表引用工艺路线,应如何制作py和xml文件
  • ¥15 根据历史数据,推荐问题类型
  • ¥15 需要仿真图,简单的二阶系统实例
  • ¥15 stm32光控照明仿真
  • ¥15 使用人工智能的方法生成满足一定统计参数要求的随机数序列
  • ¥15 SENT协议中相关问题咨询