本文介绍了PLpgSQL函数未返回匹配的标题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在收到文本时返回电影名称以及演员和工作人员的数量。当我输入字符串并使用ilike时,我的查询没有返回匹配的标题。我在前面创建了一个视图,其中包含要在函数中输入的电影标题和剧组人数。我的代码是:

create or replace view movies_crew as 
select movies.id, movies.title, principals.role
from movies
join principals on principals.movie_id=movies.id 
where principals.role <> 'producer'
;


create or replace view movie_makers as
select movies_crew.title, count(movies_crew.title) as ncrew
from movies_crew
where movies_crew.title = 'Fight Club'
group by movies_crew.title;


CREATE or REPLACE function Q11(partial_title text) 
RETURNS SETOF text
AS $$
    DECLARE
         title text;
    BEGIN
        for title in
            select movie_makers.title, movie_makers.ncrew 
            from movie_makers
            where movie_makers.title ilike '%$1%'
        loop
            return next movie_makers.title||'has'||movie_makers.ncrew||'cast and crew';
        end loop;
        if(not found) then
            return next 'No matching titles';
        end if;

    END;
    
$$ LANGUAGE plpgsql;

select * from q11('Fight Club')

我的数据库是:https://drive.google.com/file/d/1NVRLiYBVbKuiazynx9Egav7c4_VHFEzP/view?usp=sharing

推荐答案

撇开您的即时报价问题不谈(杰夫已经很好地解决了),该函数可以更简单、更快,如下所示:

CREATE or REPLACE FUNCTION q11(partial_title text) 
  RETURNS SETOF text
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY
   SELECT m.title || ' has ' || m.ncrew || ' cast and crew'
   FROM   movie_makers m
   WHERE  m.title ~* $1;
   
   IF NOT FOUND THEN
      RETURN NEXT 'No matching titles';
   END IF;
END
$func$;

要点:

撇开:在一个已经选择了"Fight Club"作为其唯一行的视图上进行筛选几乎没有意义。对于有意义的搜索,您不会使用这些视图...

这篇关于PLpgSQL函数未返回匹配的标题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-01 10:46