Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据变量使用不同的子查询_Sql_Postgresql_Subquery - Fatal编程技术网

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

我试图更改表达式中使用的子查询,具体取决于传递给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, 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
     )