首页 > 解决方案 > 如何使用 psql CASE WHEN 测试正则表达式

问题描述

如果以 F 开头,我编写的下一个函数尝试返回相同的 mcode,如果只是一个数字,split_part(mcode, ':', 2)则返回类似 N43452的内容。split_part(mcode, ':', 2)我正在尝试使用正则表达式运算符〜。我可以使用 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 ...
                 ^

标签: postgresqlplpgsql

解决方案


这是你如何做的,如果..只适用于方程式。你也需要在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;
$$;

推荐阅读