如果数组足够长,第 N 个数组项上的 Clickhouse 逻辑

问题描述 投票:0回答:2

我想将字符串日期数组转换为两个单独的日期时间列。

该数组始终至少有一个字符串日期,有时会有两个字符串日期。不会有3+

提取并解析第一个字符串很容易。

但第二个有时不存在,所以我需要逻辑来处理它不存在的情况。

不幸的是,我的以下尝试出现错误。该错误向我表明,无论 myArray[2] 是否实际存在,parseDateTime 函数都正在运行,我希望 if 子句能够阻止这种情况。请注意,dateTo 和 dateToAlternative 查询行都会给出相同的错误。

  with base as (
select ['2024-05-08 15:10:49'] as myArray
     ) 
select parseDateTime(myArray[1], '%Y-%m-%d %H:%i:%s') as dateFrom
     , case when length(myArray) > 1 then parseDateTime(myArray[2], '%Y-%m-%d %H:%i:%s') else null end as dateTo
     , if(length(myArray) > 1, parseDateTime(myArray[2], '%Y-%m-%d %H:%i:%s'), null) as dateToAlternative
  from base

enter image description here

如果 myArray 只有一项,我希望 if 子句返回 null。

sql arrays datetime clickhouse
2个回答
0
投票

您至少有一个包含两个日期的数组吗?如果是这样,那应该可以工作(为了方便起见,我将您的查询更改为使用 CASE WHEN ,您的查询也应该可以工作):

with base as (
select ['2024-05-08 15:10:49'], ['2024-05-08 15:10:49','2024-05-08 15:10:49'] as myArray
     ) 

SELECT
    parseDateTime(myArray[1], '%Y-%m-%d %H:%i:%s') AS dateFrom,
    CASE WHEN length(myArray) > 1 THEN parseDateTime(myArray[1], '%Y-%m-%d %H:%i:%s') ELSE NULL END AS dateTo
FROM base

0
投票

这对我有用:

  with base as (
select arrayMap(x -> parseDateTime(x, '%Y-%m-%d %H:%i:%s'), ['2024-05-08 15:10:49']) as myDateArray
     ) 
select myDateArray[1] as dateFrom
     , case when myDateArray[2] = '1970-01-01 00:00:00' then null else myDateArray[2] end as dateTo
  from base
© www.soinside.com 2019 - 2024. All rights reserved.