Sql 使用SELECT CASE创建函数

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

我想创建一个具有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 <= 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')