【问题标题】:Postgres control flow--multiple return valuesPostgres控制流--多个返回值
【发布时间】:2013-03-28 16:48:35
【问题描述】:

我有一堆关于地址的业务数据库查询,我经常想将它们重新分类为给定(已知)区域内部或外部。

SELECT CASE 构造非常适合此目的,但我经常遇到这样的情况,即我想要基于相同条件测试的多个返回值。例如,如果业务在某个区域,我将其归类为“内部”,但我也可能出于同样的原因,最好在同一个 CASE 块中,设置另一个值或标志,不同地加权观察,等等以 CASE 标准为真为条件。

利用长条件语句并同时获取多个返回值的最佳/最简单方法是什么?那只是plpgsql的域名吗?

编辑:添加了模拟数据,如下。这进行了分类,但如果我想衡量每个机构的就业情况,我需要一个单独的 CASE 块,具有相同的标准。这就是我想要解决的问题。

SELECT 
City, CASE WHEN City =ANY (ARRAY['San Francisco', 'San Mateo','Oakland','Marin','Santa Clara']) 
THEN City ELSE 'outside'::text END as area,EstabEmployees
  FROM (VALUES
('San Francisco', 14), 
('San Mateo', 23),
('San Mateo', 3),
('San Francisco', 34),
('Visalia', 65),
('Juneau', 23),
('Mendocino', 5),
('Santa Clara', 1),
('Los Angeles', 56),
('San Mateo', 11),
('Los Angeles', 30),
('Marin', 33),
('Oakland', 14),
('Oakland', 2)
) AS t (City, EstabEmployees)

;

【问题讨论】:

  • 请发布一些示例数据和所需的输出

标签: postgresql postgresql-9.1


【解决方案1】:

最简单的方法是利用另一个或两个定义关系的表。

见:http://sqlfiddle.com/#!1/ef0bb/6

为了保留以备将来使用,这里是 sqlfiddle 的“架构”(我正在使用 DDL 和 DML 的组合)

create table metros(
  id serial primary key,
  name varchar(100),
  data varchar (100)
);


create table metromappings  (
    id serial primary key,
    metroid int references metros(id),
    cityname varchar(100) not null
);

insert into metros(name) values ('San Francisco Area');

insert into metromappings(metroid,cityname) 
select  currval(pg_get_serial_sequence('metros', 'id')), name 
 from (values ('San Francisco'), 
  ('San Mateo'),
  ('Oakland'),
  ('Marin'),
  ('Santa Clara')) as t(name);

下面是我对如何使用它的介绍:

select 
case when m.id IS NULL THEN 'outside::' ELSE t.City END AS area,EstabEmployees
from
(metros m inner join metromappings mm 
 on m.id = mm.metroid and m.name =ANY (ARRAY['San Francisco Area1'])) -- add more stuff here
full outer join
(VALUES
('San Francisco', 14), 
('San Mateo', 23),
('San Mateo', 3),
('San Francisco', 34),
('Visalia', 65),
('Juneau', 23),
('Mendocino', 5),
('Santa Clara', 1),
('Los Angeles', 56),
('San Mateo', 11),
('Los Angeles', 30),
('Marin', 33),
('Oakland', 14),
('Oakland', 2)
) AS t (City, EstabEmployees) on t.City = mm.cityname
order by area, EstabEmployees;

请注意,如果只是为了消除将同一城市添加到同一区域两次的可能性(或者只是将这对定义为键并设置id 作为一些唯一索引;我不确定哪个是最好的)。

【讨论】:

  • 这作为一种自我记录的方法效果很好——但可能是最接近于 ad-hoc 的方法,除了 pgplsql
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 2016-07-09
  • 1970-01-01
  • 2023-02-04
相关资源
最近更新 更多