使用列作为参数的Snowflake UDF

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

是否可以使用视图列作为输入参数来调用 Snowflake 中的 UDF?我有一列包含多个日期,用 | 分隔我想检查其中至少一个日期是否落在每一行的给定范围内。

我尝试了下面的代码,但它抛出“VALUES 子句中的表达式无效”错误。当您手动传递单个值时它可以工作,但当您传递一列作为输入参数 DATE_LIST 时则不起作用

CREATE OR REPLACE FUNCTION CHECK_DATE_RANGE (DATE_LIST VARCHAR, START_DT DATE, END_DT DATE)
RETURNS table (a boolean)
LANGUAGE SQL
AS 
'WITH data_list AS (
    SELECT ORDER_DT_LIST
    FROM tableName
    WHERE DATE_LIST = ORDER_DT_LIST
),
data_range AS (
    SELECT value BETWEEN USER_START_DT AND USER_END_DT AS TF
    FROM data_list, lateral split_to_table(ORDER_DT, ''|'')
    ORDER BY seq, index
),
data_bool AS (
    SELECT CASE WHEN SUM(CASE WHEN TF=TRUE THEN 1 ELSE 0 END) > 0 THEN TRUE 
    ELSE FALSE 
    END AS CHECK_DATE_RANGE
    FROM data_range
)
select * FROM data_bool
';
sql snowflake-cloud-data-platform user-defined-functions
1个回答
0
投票

鉴于您所显示的 UDF,您实际上并不需要 UDF 或 UDTF,并且可以内联完成所有操作:

with tablename(order_dt_list, start_dt, end_dt) as (
    select * from values
        ('2024-09-24', '2024-08-01'::date,'2024-08-31'::date),
        ('2024-09-24|2024-08-24', '2024-08-01'::date,'2024-08-31'::date),
        ('2024-10-24|2024-09-24|2024-08-24', '2024-08-01'::date,'2024-08-31'::date)
)
select 
    t.order_dt_list, t.start_dt, t.end_dt,
    SUM(iff(s.value::text::date BETWEEN t.start_dt AND t.end_dt, 1, 0)) > 0 AS CHECK_DATE_RANGE
from tablename as t
  , lateral split_to_table(t.order_dt_list, '|') as s
group by 1,2,3,s.seq

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.