0

住所を含むビジネス データベースに多数のクエリがあり、それらを特定の (既知の) エリアの内側または外側として再分類したいことがよくあります。

このSELECT CASE構成はこの目的には最適ですが、テスト対象の同じ条件に基づいて複数の戻り値が必要な状況に陥ることがよくあります。たとえば、ビジネスが特定の領域にある場合、私はそれを「内部」として分類しますが、同じトークンで、できれば同じ CASE ブロックで、別の値またはフラグを設定し、観察結果の重み付けを変えることもできます。 CASE 基準が true であることを条件とします。

長い条件ステートメントを活用して複数の戻り値を同時に取得するための最良/最も簡単な方法は何ですか? 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

これを行う最も簡単な方法は、リレーションシップを定義する別のテーブルまたは 2 つのテーブルを利用することです。

参照: 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;

同じ都市を同じエリアに 2 回追加する可能性を排除するためだけに、metroid、cityname でクラスタリング/一意のインデックス作成を実行することをお勧めします (または、ペアをキーとして定義し、id をいくつかとして設定するだけです)。一意のインデックス; どれが最適かはわかりません)。

于 2013-03-28T18:14:37.927 に答える