如何使用 psql CASE WHEN 测试正则表达式

How to use psql CASE WHEN to test regular expressions

如果 split_part(mcode, ':', 2) 以 F 开头,我编写的下一个函数将尝试 return 相同的 mcode;如果 split_part(mcode, ':', 2) 只是一个数字,则 returns 类似于 N43452。我正在尝试使用正则表达式运算符 ~。我可以使用 IF THEN 来做到这一点,但我正在尝试使用 CASE WHEN。有什么我犯错的想法吗?

CREATE OR REPLACE FUNCTION getCode(mcode TEXT)
RETURNS TEXT
LANGUAGE plpgsql
AS 
$$
BEGIN
    CASE split_part(mcode, ':', 2)
        WHEN  (~ '^F')      THEN RETURN mcode
        WHEN  (~ '[0-9]+$') THEN RETURN CONCAT('N', mcode)
        ELSE RETURN mcode
    END;    


END;
$$;

我也试过:

CREATE OR REPLACE FUNCTION getCode(mcode TEXT)
RETURNS TEXT
LANGUAGE plpgsql
AS 
$$
BEGIN
     CASE WHEN  (split_part(mcode, ':', 2) ~ '^F')      THEN RETURN mcode
          WHEN  (split_part(mcode, ':', 2) ~ '[0-9]+$') THEN RETURN CONCAT('N', mcode)
          ELSE RETURN mcode
     END;    
 
END;
$$;

收到消息:

ERROR:  syntax error at or near "WHEN"
          WHEN  (split_part(mcode, ':', 2) ~ '[0-9]+$') THEN ...
                 ^

这是你的做法, 当 .. 仅适用于等式时的情况。您还需要在 case 语句之前放置一次 return 就完成了。

CREATE OR REPLACE FUNCTION getCode(mcode TEXT)
RETURNS TEXT
LANGUAGE plpgsql
AS 
$$
BEGIN
   return 
    CASE WHEN split_part(mcode, ':', 2) ~ '^F' THEN  mcode
         WHEN split_part(mcode, ':', 2)  ~ '[0-9]+$' THEN  CONCAT('N', mcode)
        ELSE  mcode
    END;    
END;
$$;