我在带有地址的业务数据库上有很多查询,我经常想把它们重新分类为给定(已知)区域内部或外部。
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)
答案 0 :(得分: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;
请注意,您可能希望对metroid,cityname进行一些群集/唯一索引,如果只是为了消除将同一城市添加到同一区域两次的可能性(或者只是将该对定义为关键并设置id作为一些独特的索引;我不确定哪个是最好的。)