дублирование кода в инструкциях SQL - PullRequest
2 голосов
/ 23 марта 2010

Привет, я пытаюсь вывести что-то вроде следующего, но обнаружил, что происходит много дублирования кода.

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

...

Мой запрос выглядит так с двумя инструкциями case, которые выполняют одно и то же, но переворачивают страну (мой реальный запрос содержит 5 из этих операторов case):

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

Есть ли способ для меня как-то сжать это и избежать такого большого дублирования кода?

Спасибо!

1 Ответ

2 голосов
/ 23 марта 2010

Использование:

   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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...