如何在 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?

如何在 Redshift 中创建自定义聚合 UDF 函数?

redshift 更改 udf 更改所有者

如何避免 Redshift Python UDF 出现 UnicodeDecodeError ascii 错误?

Redshift UDF boto sql 查询和 S3

如何让我的 Amazon Redshift UDF 接收字符串而不是列表?