2011-09-12 165 views
1

运行PostgreSQL的7.x版(是的,我升级)CASE语句结果多个字段

例子:

SELECT 
    CASE 
     WHEN "substring"(t."Field"::text, 0, 3) = '01'::text THEN 'group one'::text 
     WHEN "substring"(t."Field"::text, 0, 4) = '123'::text THEN 'group one'::text 
     WHEN "substring"(t."Field"::text, 0, 5) = '4567'::text THEN 'group two'::text 
     WHEN "substring"(t."Field"::text, 0, 6) = '99999'::text THEN 'group three'::text 
     WHEN "substring"(t."Field"::text, 0, 3) = '07'::text THEN 'group three'::text 
     ELSE NULL::text 
    END AS new_field, 
    CASE 
     WHEN "substring"(t."Field"::text, 0, 3) = '01'::text THEN 'subgroup a'::text 
     WHEN "substring"(t."Field"::text, 0, 4) = '123'::text THEN 'subgroup a'::text 
     WHEN "substring"(t."Field"::text, 0, 5) = '4567'::text THEN 'subgroup a'::text 
     WHEN "substring"(t."Field"::text, 0, 6) = '99999'::text THEN 'subgroup a'::text 
     WHEN "substring"(t."Field"::text, 0, 3) = '07'::text THEN 'subgroup b'::text 
     ELSE NULL::text 
    END AS another_new_field,... 

有没有办法有一个case语句给两个字段的结果作为处理的数据是相同的,它只是不同的标签。

+0

没有具体很难肯定地说,但听起来像是违反3NF的结构,如果两个列的值的逻辑是相同的。也许不会,因为你从两个地方拉,但正如我所说,很难说。 –

+0

耶从一个来源拉,但一个是一个组,一个是一个小组,这个例子并没有真正显示这个 –

回答

0

我对Postgre不熟悉,但也许你可以尝试一个公共表表达式来建立一个索引你的查找条件和输出结果的组和子组,这可能看起来像这样(当然,条件可以来自实际的表,以及...):

with Lookup as (
    select 0 as start, 3 as end, 
     '01' as match, 'group one' as sgroup, 'subgroup a' as subgroup union 
    select 0 as start, 4 as end, 
     '123' as match, 'group one' as sgroup, 'subgroup a' as subgroup union 
    select 0 as start, 5 as end, 
     '4567' as match, 'group two' as sgroup, 'subgroup a' as subgroup union 
    select 0 as start, 6 as end, 
     '99999' as match, 'group three' as sgroup, 'subgroup a' as subgroup union 
    select 0 as start, 3 as end, 
     '07' as match, 'group three' as sgroup, 'subgroup b' as subgroup union 
) 
select 
    L.sgroup as new_field, 
    L.subgroup as another_new_field 
from table T 
left join Lookup L on "substring"(T."Field"::text, L.start, L.End) = L.match 

然后你只需要一次定义的条件,一旦符合他们得到输出这两个领域。正如@Tom在评论中所表达的那样,这种场景在SQL中处理得并不好,所以你只剩下一个像上面这样更“黑客”的解决方案。

最好的问候,