2010-03-23 4 views
2

Salut J'essaie de produire quelque chose comme ce qui suit, mais je constate qu'il y a beaucoup de duplication de code en cours.duplication de code dans les déclarations de cas sql

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

...

Ma requête ressemble à ceci avec deux déclarations de cas qui font la même chose, mais retournez le pays (ma vraie requête a 5 de ces déclarations de cas):

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 

Y a-t-il un moyen pour moi de condenser cela d'une façon ou d'une autre et de ne pas avoir autant de duplication de code?

Merci!

+0

Vous ne devriez pas besoin de faire des déclarations de cas comme celui-ci - Ce serait mieux si vous avez publié quelques lignes de chacun de votre table (s) –

+0

@NS: est-il un particulier SGBD avec lequel vous voulez travailler, ou cherchez-vous une solution générale? – outis

+1

Désolé pour hors sujet, mais WTF construisez-vous? Les gens avec la peau? Y a-t-il des gens SANS peau? Des démangeaisons? –

Répondre

2

Utilisation:

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

Merci pour la réponse mais je ne pense pas que cela fonctionnera pour moi. Je ne peux pas LEFT JOIN car ces tables peuvent avoir plusieurs lignes avec le même ID de personne. Désolé, j'ai créé un mauvais exemple pour le problème. –

+0

@NS utilise DISTINCT pour se débarrasser de plusieurs lignes. – jva

+0

@NS: jva est correct; J'ai mis à jour la réponse en conséquence. –

Questions connexes