如何在 Redshift UDF 中 trim 变量

How to trim variable in Redshift UDF

感谢这里的建议,现在我可以通过 Redshift UDF 检查日期值了,How to check if '20210228' is a valid date? - whosebug.com

为了排除 null 或 '',我添加了 'if x1 is None or x1 == '' : return False',它起作用了。 但我仍然需要排除 space ' ' -- 目前它 return 是真的,即使它不是正确的日期值。

如果我 trim 目标值在 UDF 之外,它 return 是错误的,正如预期的那样。似乎我不能在 UDF 中使用 trim,例如 'if trim(x1) is None or trim(x1) == '' : return False'。或者不能使用像 '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;

我已经测试了所有案例并且它有效:

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;