是否可以使用视图列作为输入参数来调用 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
';
鉴于您所显示的 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