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