Sql 使用SELECT CASE创建函数
我想创建一个具有2个参数的函数。这是我的SELECT语句:Sql 使用SELECT CASE创建函数,sql,postgresql,plpgsql,return-type,set-returning-functions,Sql,Postgresql,Plpgsql,Return Type,Set Returning Functions,我想创建一个具有2个参数的函数。这是我的SELECT语句: SELECT CASE WHEN duration <= 10000000 THEN '00-01 sec' WHEN duration <= 40000000 THEN '01-04 sec' WHEN duration <= 100000000 THEN '04-10 sec' WHEN duration <= 30000000
SELECT CASE
WHEN duration <= 10000000 THEN '00-01 sec'
WHEN duration <= 40000000 THEN '01-04 sec'
WHEN duration <= 100000000 THEN '04-10 sec'
WHEN duration <= 300000000 THEN '10-30 sec'
WHEN duration <= 600000000 THEN '30-60 sec'
ELSE 'more than 60 sec' END AS "Kategorien",
COUNT(*) AS Requestcounter
FROM tablename
WHERE starttime BETWEEN '2016-03-01 00:00:00' AND '2016-03-08 14:00:00'
GROUP BY
(CASE WHEN duration <= 10000000 THEN '00-01 sec'
WHEN duration <= 40000000 THEN '01-04 sec'
ELSE 'more than 60 sec' END);
我想从我的函数中得到这个结果。但我得到了一个错误:
查询没有结果数据的目标
这是我的职责:
CREATE OR REPLACE FUNCTION requestcounter(mindate timestamptz,maxdate timestamptz)
RETURNS SETOF integer AS $$
BEGIN
SELECT CASE WHEN duration <= 10000000 THEN '00-01 sec'
WHEN duration <= 40000000 THEN '01-04 sec'
ELSE 'more than 60 sec' END AS "Kategorien",
COUNT(*) AS Requestcounter from tablename where starttime BETWEEN mindate and maxdate
GROUP BY
(CASE WHEN duration <= 10000000 THEN '00-01 sec'
WHEN duration <= 40000000 THEN '01-04 sec'
ELSE 'more than 60 sec' END);
Return;
END;
$$ LANGUAGE plpgsql;
我知道返回一组整数是不对的,但我不知道如何让它工作?我想你应该返回一个表,而不是一组整数 像这样:
CREATE OR REPLACE FUNCTION requestcounter (mindate timestamptz, maxdate timestamptz) RETURNS TABLE (
Kategorien text,
requestcounter int
) AS
$BODY$
BEGIN
RETURN QUERY
SELECT CASE WHEN duration <= 10000000 THEN '00-01 sec'
WHEN duration <= 40000000 THEN '01-04 sec'
ELSE 'more than 60 sec' END AS "Kategorien",
COUNT(*) AS Requestcounter from tablename where starttime BETWEEN mindate and maxdate GROUP BY
(CASE WHEN duration <= 10000000 THEN '00-01 sec'
WHEN duration <= 40000000 THEN '01-04 sec'
ELSE 'more than 60 sec' END);
END
$BODY$
LANGUAGE 'plpgsql';
我认为您编写的函数运行的是一个select查询,无处发送输出,然后返回一组空整数。这就是为什么会出现此错误。已经提供了需要返回查询才能从数据库中实际返回查询结果的功能
但是您不需要plpgsql来进行简单的选择。改用a。您需要以任何一种方式定义返回类型,最好使用@Travis,但实际返回的数据类型必须精确匹配:
CREATE OR REPLACE FUNCTION requestcounter(_mindate timestamptz, _maxdate timestamptz)
RETURNS TABLE (kategorien text, requestcounter int) AS
$func$
SELECT CASE WHEN duration <= 10000000 THEN '00-01 sec'::text
WHEN duration <= 40000000 THEN '01-04 sec'
-- more cases ...
ELSE 'more than 60 sec' END -- AS kategorien -- not visible outside function
, count(*)::int -- AS requestcounter
FROM tablename
WHERE starttime BETWEEN _mindate AND _maxdate
GROUP BY 1 -- simpler with positional reference
ORDER BY 1 -- see below
$func$ LANGUAGE sql; -- never quote the language name
谢谢你的帮助!请求计数器------00-01秒,2979 01-04秒,2这是我的结果-可能是这样的:Kategorien |请求计数器------+-----00-01秒| 2073 01-04秒| 2?致以最诚挚的问候,这样我就有了两列?@cartmanownz:用SELECT*FROM调用您的函数。。。分解行。再次非常感谢!!我在postgres 9.3.8中尝试了这一点-它是有效的,但在8.4中有一个问题。你知道为什么吗?@cartmanownz:SQL函数从第9.2页开始就支持参数名。更多:再次感谢-menas _mindate/_maxdate将不会在postgres 8.4中出现。正当我能做什么?我必须使用$n符号吗?
CREATE OR REPLACE FUNCTION requestcounter(_mindate timestamptz, _maxdate timestamptz)
RETURNS TABLE (kategorien text, requestcounter int) AS
$func$
SELECT CASE WHEN duration <= 10000000 THEN '00-01 sec'::text
WHEN duration <= 40000000 THEN '01-04 sec'
-- more cases ...
ELSE 'more than 60 sec' END -- AS kategorien -- not visible outside function
, count(*)::int -- AS requestcounter
FROM tablename
WHERE starttime BETWEEN _mindate AND _maxdate
GROUP BY 1 -- simpler with positional reference
ORDER BY 1 -- see below
$func$ LANGUAGE sql; -- never quote the language name
SELECT * FROM requestcounter('2015-01-01 00:00+01', '2015-03-01 00:00+01')