(随意修改标题)
嗨,我在MacOSX上使用Postgres 9.3。我对任何一种SQL都不熟悉。我正在尝试创建一个查询函数(下面的代码和示例),它通过使用individuals
汇集某些列来计算不同的条目(SELECT DISTINCT ON
)。这很好用。当我在同一个函数中添加CASE
语句来检查另一列的每一行是否返回NULL
时,问题就出现了。
所以,我有一个看起来像这样但有数千个条目的表。 Here is a subset您可以在其中查看特定物种和方法的数据。地理数据具有不同的分辨率,但在这里我汇集了species, method, location, larger_region
列(例如,汇集method
是多余的)请参阅下面的代码和输出。
--CODE
CREATE TABLE test_tbl (accn varchar(10) PRIMARY KEY, method TEXT, species VARCHAR(30), lat NUMERIC,
lon NUMERIC, location TEXT, larger_region TEXT, coords BOOLEAN DEFAULT TRUE);
FETCH FORWARD 1 FROM test_tbl;
accn | method | species | lat | lon | location | larger_region | coords
---------+----------+-------------------+----------+----------+----------------------------+---------------+---------
EU336944 | Isolate | Dysidea granulosa | 10.07704 | 73.63238 | Lakshadweep Islands, India | Indian EEZ | t
CREATE TABLE test_view_tbl ( species VARCHAR(30) NOT NULL, no_ind BIGINT NOT NULL, method TEXT NOT NULL, location TEXT NOT
NULL, larger_region TEXT NOT NULL );
下面的函数会产生正确的输出。
CREATE FUNCTION test_view() RETURNS SETOF test_view_tbl AS $$
SELECT DISTINCT ON (species, method, location, larger_region) species, count(species), method, location, larger_region
FROM test_tbl
GROUP BY species, method, location, larger_region
ORDER BY species;
$$ LANGUAGE sql
SELECT * FROM test_view();
species | no_ind | method | location | larger_region
------------------+--------+---------+--------------------------------------+---------------
Dysidea granulosa | 6 | Isolate | Kavaratti Island, Lakshadweep, India | Indian EEZ
Dysidea granulosa | 13 | Isolate | Lakshadweep Islands, India | Indian EEZ
下面我通过添加test_view_tbl
列boolean
来修改coords
并相应地修改代码。这将检查列lat
是否为NULL
,即每个条目是否都有坐标。然而,这也通过不返回某些条目来搞砸上述想要的结果。
ALTER TABLE test_view_tbl ADD COLUMN coords BOOLEAN DEFAULT TRUE;
CREATE FUNCTION test_view() RETURNS SETOF test_view_tbl AS $$
SELECT DISTINCT ON (species, method, location, larger_region) species, count(species), method, location, larger_region,
CASE WHEN lat IS NULL THEN coords IS FALSE ELSE TRUE
END
FROM test_tbl
GROUP BY species, method, location, larger_region, lat, coords
ORDER BY species;
$$ LANGUAGE sql
SELECT * FROM test_view();
species | no_ind | method | location | larger_region | coords
-------------------+--------+---------+--------------------------------------+---------------+--------
Dysidea granulosa | 6 | Isolate | Kavaratti Island, Lakshadweep, India | Indian EEZ | t
Dysidea granulosa | 3 | Isolate | Lakshadweep Islands, India | Indian EEZ | t
因此,代码的每个部分都可以工作,但显然不在一起,因为它会在10个条目上返回NULL
。它似乎只计算lat
location
中的每个不同坐标(Lakshadweep Islands, India
)我试图修复它但没有成功。我希望有一些指示,谢谢