为什么Postgresql为计数请求提供行数答案?

为什么Postgresql为计数请求提供行数答案?,postgresql,count,Postgresql,Count,我正在使用Postgresql9.4。 我已将此表记录下来: Colonne | Type | Modificateurs ---------+-----------------------+--------------- noemp | integer | non NULL nomemp | character varying(15) | emploi | character varying(14) | mg

我正在使用Postgresql9.4。 我已将此表记录下来:

 Colonne |         Type          | Modificateurs 
---------+-----------------------+---------------
 noemp   | integer               | non NULL
 nomemp  | character varying(15) | 
 emploi  | character varying(14) | 
 mgr     | integer               | 
 dateemb | date                  | 
 sal     | real                  | 
 comm    | real                  | 
 nodept  | integer               | 
其中包含以下值:

noemp |  nomemp   |     emploi     | mgr  |  dateemb   | sal  | comm | nodept 
-------+-----------+----------------+------+------------+------+------+--------
  7369 | SERGE     | FONCTIONNAIRE  | 7902 | 1980-12-07 |  800 |      |     20
  7499 | BRAHIM    | VENDEUR        | 7698 | 1981-02-20 | 1600 |  300 |     30
  7521 | NASSIMA   | VENDEUR        | 7698 | 1981-02-22 | 1250 |  500 |     30
  7566 | LUCIE     | GESTIONNAIRE   | 7839 | 1981-04-02 | 2975 |      |     20
  7654 | MARTIN    | VENDEUR        | 7698 | 1981-09-28 | 1250 | 1400 |     30
  7698 | BENJAMIN  | GESTIONNAIRE   | 7839 | 1981-05-01 | 2850 |      |     30
  7782 | DAYANE    | GESTIONNAIRE   | 7839 | 1981-06-09 | 2450 |      |     10
  7788 | ARIJ      | ANALYSTE       | 7566 | 1982-12-09 | 3000 |      |     20
  7839 | MAYAR     | PRESIDENT      |      | 1981-11-17 | 5000 |      |     10
  7844 | ROI       | VENDEUR        | 7698 | 1981-09-08 | 1500 |    0 |     30
  7876 | VIRGINIE  | FONCTIONNAIRE  | 7788 | 0983-01-12 | 1100 |      |     20
  7902 | ASMA      | ANALYSTE       | 7566 | 1981-12-03 | 3000 |      |     20
  7934 | SIMONE    | FONCTIONNAIRE  | 7782 | 1982-01-23 | 1300 |      |     10
  7900 | LYNA      | FONCTIONNAIRE  | 7698 | 1981-12-03 |  950 |      |     30
(14 lignes)
当我创建一个函数来计算“
nodept
”的数量时,使用一个类似这样的询问值:

CREATE OR REPLACE FUNCTION depcount(integer)RETURNS integer AS $$
DECLARE
somme integer;
BEGIN
SELECT DISTINCT(COUNT(*)) FROM EMP WHERE nodept=$1 INTO somme ;

RETURN somme;
END$$ 
LANGUAGE plpgsql;
使用
从EMP中选择depcount(30)
我得到的答案是:

----------
        6
        6
        6
        6
        6
        6
        6
        6
        6
        6
        6
        6
        6
        6
(14 lignes)
14个结果,因为我通常只有一个。 我必须指定我这样做是为了一门课程,我不能更改postgresql版本,它必须是9.4。 如果你知道为什么我得到14个结果而不是一个?
谢谢。

您每行执行一次函数,运行
选择计数(*)
14次,每行获得一次结果。
您可能希望
选择depcount(30)
(不带
FROM
子句),以便只运行该函数一次


另一方面,在我看来,在大多数情况下,使用函数进行此类查询有点过头了。您也不需要使用
plpgsql
语言sql
在这里就足够了(尽管您的函数可能比示例中的函数复杂一点)。使用
DISTINCT(COUNT(*)
也没有什么意义。

您是从EMP表中选择的,不进行筛选,因此您可以在该表中的行中获得结果。只需尝试“选择depcount(30)”;或“从EMP限制1中选择depcount(30)”