2010-03-23 79 views
2

嗨我想输出类似下面的东西,但我发现有很多代码重复正在进行。sql case语句中的代码重复

| australian_has_itch | kiwi_has_itch | 
| yes     | no   | 
| no     | n/a   | 
| n/a     | no   | 

...

我的查询看起来像这样与做同样的事情,但翻转国家二级case语句(我真正的查询有这些case语句5):

SELECT 
    CASE 
    WHEN 
     NOT EXISTS (
     SELECT person_id 
     FROM people_with_skin 
     WHERE people_with_skin.person_id = people.person_id 
     AND people.country = "Australia" 
    ) 
     THEN 'N/A' 
    WHEN 
     EXISTS (
     SELECT person_id 
     FROM itch_none_to_report 
     WHERE people.country = "Australia" 
     AND person_id = people.person_id 
    ) 
     THEN 'None to report' 
    WHEN 
     EXISTS (
     SELECT person_id 
     FROM itchy_people 
     WHERE people.country = "Australia" 
     AND person_id = people.person_id 
    ) 
     THEN 'Yes' 
    ELSE 'No' 
    END australian_has_itch, 

    CASE 
    WHEN 
     NOT EXISTS (
     SELECT person_id 
     FROM people_with_skin 
     WHERE people_with_skin.person_id = people.person_id 
     AND people.country = "NZ" 
    ) 
     THEN 'N/A' 
    WHEN 
     EXISTS (
     SELECT person_id 
     FROM itch_none_to_report 
     WHERE people.country = "NZ" 
     AND person_id = people.person_id 
    ) 
     THEN 'None to report' 
    WHEN 
     EXISTS (
     SELECT person_id 
     FROM itchy_people 
     WHERE people.country = "NZ" 
     AND person_id = people.person_id 
    ) 
     THEN 'Yes' 
    ELSE 'No' 
    END kiwi_has_itch, 
FROM people 

有没有办法让我以某种方式压缩它,而不是有太多的代码重复?

谢谢!

+0

你不应该需要做的案例陈述这样的 - 这将是最好的,如果你发布的每个表(S) – 2010-03-23 05:28:58

+0

@NS的几行:有没有特别的你想要这个工作的DBMS,还是你在寻找一个通用的解决方案? – outis 2010-03-23 05:30:49

+1

对不起主题,但跆拳道你建设吗?有皮肤的人?有没有皮肤的人?痒? – 2010-03-23 05:43:24

回答

2

用途:

SELECT CASE 
      WHEN x.personid IS NOT NULL AND x.country = 'Australia' THEN 'N/A' 
      WHEN y.personid IS NOT NULL AND y.country = 'Australia' THEN 'None to report' 
      ELSE 'No' 
      END AS australian_has_itch, 
      CASE 
      WHEN x.personid IS NOT NULL AND x.country = 'NZ' THEN 'N/A' 
      WHEN y.personid IS NOT NULL AND y.country = 'NZ' THEN 'None to report' 
      ELSE 'No' 
      END AS australian_has_itch 
    FROM PEOPLE p 
LEFT JOIN (SELECT DISTINCT 
        pws.person_id, 
        p.country 
      FROM people_with_skin pws 
      JOIN PEOPLE p ON p.person_id = pws.person_id) x ON x.person_id = p.person_id 
LEFT JOIN (SELECT DISTINCT 
        intr.person_id, 
        p.country 
      FROM itch_none_to_report intr 
      JOIN PEOPLE p ON p.personid = intr.personid) y ON y.person_id = p.person_id 
+0

感谢您的回应,但我认为这不会对我有用。我不能左连接,因为这些表可以有多个具有相同person_id的行。抱歉,我为这个问题创建了一个糟糕的例子。 – 2010-03-23 06:36:37

+0

@NS使用DISTINCT来摆脱多行。 – jva 2010-03-23 09:00:24

+0

@NS:jva是正确的;我相应地更新了答案。 – 2010-03-23 14:40:19