2013-03-28 72 views
0

我有一堆關於地址的業務數據庫的查詢,我經常希望將這些查詢重新分類爲在給定(已知)區域內部或外部。Postgres控制流 - 多個返回值

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) 

;

+1

請張貼一些示例數據和期望的輸出 – Quassnoi

回答

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; 

請注意,你可能想要做一些集羣/唯一索引上銀河戰士,城市名,如果只清除添加同一個城市T的可能性他相同的區域兩次(或者只是將該對定義爲關鍵字並將該id設置爲某個唯一索引;我不確定哪個是最好的)。

+0

這適用於自記錄方法 - 但可能最接近一個臨時方法,除了pgplsql – ako