当给定文本时,我试图返回电影名称以及演员和工作人员的数量。当我输入字符串并使用 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 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$;
主要观点:
-
你的功能仍然被破坏。参考文献movie_makers.title
and movie_makers.ncrew
不会那样工作的。我修好了它。
-
Use RETURN QUERY
而不是循环。这样我们也根本不需要使用甚至声明任何变量。看:
- 如何在 PostgreSQL 函数中返回 SELECT 的结果? https://stackoverflow.com/questions/7945932/how-to-return-result-of-a-select-inside-a-function-in-postgresql/7945958#7945958
-
可以选择使用不区分大小写的正则表达式匹配运算符~*
。 (更简单,而不是更快。)
- Postgres 中 LIKE 和 ~ 的区别 https://stackoverflow.com/questions/12452395/difference-between-like-and-in-postgres/12459689#12459689
无论哪种方式,您可能想要转义特殊字符。看:
- 正则表达式或 LIKE 模式的转义函数 https://stackoverflow.com/questions/5144036/escape-function-for-regular-expression-or-like-patterns/45741630#45741630
旁白:过滤已经选择“搏击俱乐部”作为其唯一行的视图几乎没有意义。为了进行有意义的搜索,您不会使用这些视图......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)