如何在 Redshift UDF 中修剪变量
Posted
技术标签:
【中文标题】如何在 Redshift UDF 中修剪变量【英文标题】:How to trim variable in Redshift UDF 【发布时间】:2021-03-01 17:58:23 【问题描述】:感谢这里的建议,现在我可以通过 Redshift UDF,How to check if '20210228' is a valid date? - ***.com 检查日期值。
为了排除 null 或 '',我添加了 '如果 x1 为 None 或 x1 == '' : return False',它可以工作。 但我仍然需要排除空格 ' ' - 目前它返回 true,即使它不是正确的日期值。
如果我在 UDF 之外修剪目标值,它会按预期返回 false。似乎我不能在 UDF 中使用修剪,例如“如果修剪(x1)为无或修剪(x1)==”:返回假。或者不能使用像 'len(x1) > 0' 这样的长度函数。
如果您能给我进一步的建议以改进 UDF,我将不胜感激。提前谢谢你。
--example
select f_isdate('2021-03-01'); --> returns true, since it's correct date string
select f_isdate(''); --> returns false, as expected
select f_isdate('0'); --> returns false, as expected
select f_isdate(' '); --> returns true, as NOT expected
select f_isdate(trim(' ')); --> returns false, if the target value is trimmed
-- revised UDF
CREATE OR REPLACE FUNCTION f_isdate (x1 varchar)
returns bool
IMMUTABLE
as $$
if x1 is None or x1 == '' : return False
from dateutil.parser import parse;
try:
parse(x1,ignoretz=True);
except:
return 1==2;
else:
return 1==1;
$$ language plpythonu;
【问题讨论】:
【参考方案1】:我已经测试了所有的案例,它都有效:
CREATE OR REPLACE FUNCTION f_isdate (x1 varchar)
returns bool
IMMUTABLE
as $$
if x1 is None or x1.strip() == "":
return False
from dateutil.parser import parse
try:
parse(x1.strip(), ignoretz=True)
return True
except:
return False
$$ language plpythonu;
【讨论】:
非常非常感谢您的宝贵建议。 strip() 非常适合我。这正是我想要的!非常感谢,祝您有美好的一天。 欢迎您。您可以尝试使用 python 函数 isinstance(object, type) 使其更简单。 非常感谢进一步的善意建议!你说得对,我会更多地了解python :)以上是关于如何在 Redshift UDF 中修剪变量的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python udf 中使用 select 查询进行 redshift?