0

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

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)

;

4

1 回答 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 设置为一些唯一索引;我不确定哪个最好)。

于 2013-03-28T18:14:37.927 回答