【问题标题】:Why syntax error using case and array functions in postgreSQL ?为什么在 postgreSQL 中使用 case 和数组函数会出现语法错误?
【发布时间】:2019-03-23 02:32:29
【问题描述】:

我是 postgreSQL 数据库的新手,你能解释一下我为什么会出现语法错误吗?我在文档中找不到任何答案 docs

  CREATE OR REPLACE FUNCTION validation(string_to_match varchar [], pattern 
    varchar , validation_type varchar) RETURNS boolean AS $$  
    DECLARE a_length ALIAS FOR $1;
    DECLARE result_validation ALIAS FOR $2;
    BEGIN

    CASE validation_type
      WHEN 'login' THEN array_length (string_to_match , 1) INTO $1 RAISE NOTICE 
    'Array length is %', $1; 
      WHEN 'register' THEN array_length(string_to_match,1) INTO $1 RAISE NOTICE 
    'Array length is %', $1;
      WHEN 'contact' THEN array_length(string_to_match,1) INTO $1 RAISE NOTICE 
    'Array length is %', $1;
    END CASE; 

    END;    
    $$ lANGUAGE plpgsql;

错误:“array_length”处或附近的语法错误 第 7 行:WHEN '登录' THEN array_length (string_to_match , 1) INTO ... ^ SQL 状态:42601 字数:258

【问题讨论】:

  • 尝试将其写为when validation_type = 'login' ...when validation_type = 'register' ...etc 我不知道为什么,但我以前遇到过这个错误,并且已经解决了。
  • INTO $1 在您放置它的地方毫无意义。你到底希望它做什么?您还缺少return 声明。您必须向我们解释该功能应该做什么。据我所知,CASE 完全没有必要,因为您只需在所有情况下输出(相同)数组长度

标签: postgresql


【解决方案1】:

你可能想要这样的东西(?):

CREATE OR REPLACE FUNCTION validation(string_to_match varchar [], pattern 
varchar , validation_type varchar) 
RETURNS boolean 
AS $$  
DECLARE a_length INT;
BEGIN

    IF validation_type =  'login' THEN
        a_length := array_length(string_to_match , 1); 
        RAISE NOTICE 'Array length is %', a_length; 
    ELSIF validation_type = 'register' THEN 
        a_length := array_length(string_to_match , 1); 
        RAISE NOTICE 'Array length is %', a_length; 
    ELSIF validation_type =  'contact' THEN 
        a_length := array_length(string_to_match , 1); 
        RAISE NOTICE 'Array length is %', a_length; 
    END IF; 

    RETURN true; -- or false ? 
END;    
$$ lANGUAGE plpgsql;

【讨论】:

  • 谢谢!!是的,但我不明白我的错误.. 你能解释一下 array_length(string_to_match, 4); 背后的逻辑吗?例如,这个函数需要计算长度,但我需要将数组维度作为参数传递,否则会出错。那么如果我必须在开头传递长度,那么长度计算背后的逻辑是什么?
  • @Maks.Burkov - 您尝试使用INTO 分配变量值,但您错过了SELECT,还尝试将数组长度(int 类型)插入数组类型;你在RAISE..之前漏掉了分号;也错过了函数中的return
  • @Maks.Burkov - 我不确定我是否理解您关于array_length 的问题。 4 这里不是你一开始传递的长度,而是维度。所以如果你需要计算一维数组,第二个参数总是1
【解决方案2】:

这只是第一个直觉,但我认为这是因为 array_length 和 (string_to_match, 1) 之间的空间

【讨论】:

  • 不,没关系。这不是 MySQL
【解决方案3】:
  • CASE WHEN THEN END 不是语句,而是表达式。
  • 因此它不需要里面的那些分号...
  • 而且RAISE也不能在里面使用。
  • 表达式INTO变量是什么意思?

【讨论】:

猜你喜欢
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2019-03-09
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多