Sql 根据变量使用不同的子查询
我试图更改表达式中使用的子查询,具体取决于传递给sql的变量的值 我尝试过几种不同的方法,但没有成功。以下sql抛出错误:子查询只能返回一列Sql 根据变量使用不同的子查询,sql,postgresql,subquery,Sql,Postgresql,Subquery,我试图更改表达式中使用的子查询,具体取决于传递给sql的变量的值 我尝试过几种不同的方法,但没有成功。以下sql抛出错误:子查询只能返回一列 WITH sel_cells As ( SELECT CASE WHEN cast (RIGHT( variable, 1 ) As int)>1 THEN ( SELECT part_2.geom, part_2.gridcode FROM adm2 AS part_1, gr
WITH
sel_cells As (
SELECT
CASE WHEN cast (RIGHT( variable, 1 ) As int)>1 THEN (
SELECT part_2.geom, part_2.gridcode
FROM adm2 AS part_1, grid_1km_europe AS part_2
WHERE part_1.gid = 7224
AND ST_Intersects(part_1.geom, part_2.geom)
) ELSE (
SELECT part_2.geom, part_2.gridcode
FROM grid_1km_europe As part_2
INNER JOIN grid_1km_europe_adm2 As part_1
ON part_1.gridcode = part_2.gridcode
WHERE part_1.adm_gid = 7224
)
END
),
emissions_part As (
SELECT grid_id_1km, emissions_kg
FROM emissions
WHERE year_ = 2015 AND sector = 'Energy' AND pollutant = 'PM10'
)
SELECT
a.emissions_kg,
a.grid_id_1km,
b.geom
FROM emissions_part As a
INNER JOIN sel_cells As b
ON a.grid_id_1km = b.gridcode
我正在使用Postgres
正确的方法是什么
谢谢你的帮助 最简单的方法是使用plpgsql。创建一个基于变量动态生成查询的函数,并返回记录:
CREATE OR REPLACE FUNCTION f1(some_var BOOLEAN)
RETURNS TABLE (g INTEGER, h INTEGER) AS
$BODY$
BEGIN
RETURN QUERY EXECUTE
'WITH x AS ('
|| CASE WHEN some_var THEN
'SELECT g AS g, g AS h FROM generate_series(1, 5) g'
ELSE
'SELECT g AS g, g AS h FROM generate_series(6, 10) g'
END
|| ')
SELECT g.*, x.h
FROM generate_series(1, 10) g
INNER JOIN x ON g.g = x.g';
END
$BODY$
LANGUAGE plpgsql STABLE;
然后从f1TRUE中选择*返回:
并从f1FALSE返回中选择*
您可以使用union all:
此查询非常大。您能否指定查询的哪一部分有问题?问题出在sel_单元格部分。如果我没有使用用例,而是使用两个子查询中的一个子查询,则查询将正常工作。请共享表和所需的输出。我不确定我是否可以这样做,因为sql作为sql视图存储在Geoserver中。我不知道Geoserver是什么。就你能做什么和不能做什么而言,这意味着什么?这意味着我可能不能调用函数,不是100%确定。正如我在另一篇评论中所说,查询将在没有案例的情况下工作。我需要一个正确的语法,允许我根据变量更改子查询。这是不可能的吗?如果这是一个视图,如何在其中使用变量?变量来自哪里?不必详细说明,我可以在执行查询之前将变量从代码传递到Geoserver。太好了!!非常感谢。
with sel_cells As (
select part_2.geom, part_2.gridcode
from adm2 AS part_1 join
grid_1km_europe as part_2
on ST_Intersects(part_1.geom, part_2.geom)
where part_1.gid = 7224 and
right(variable, 1)::int > 1
union all
select part_2.geom, part_2.gridcode
from grid_1km_europe As part_2 inner join
grid_1km_europe_adm2 As part_1
on part_1.gridcode = part_2.gridcode
where part_1.adm_gid = 7224 and
right(variable, 1)::int <= 1
)