2013-08-19 2 views
0

J'écris un perltk gui qui interagit avec une base de données. Je voudrais une certaine condition sur ma requête que le champ myo_maps_study devrait correspondre à la regex MYO [0-9] * \ $ si le myo_maps_study existe. Il peut ne jamais exister pour certaines lignes. Si myo_maps_study n'existe pas, je voudrais quand même obtenir les résultatsRequête Psql en utilisant perl

Voici ma requête en cours qui vérifie uniquement le MYO [0-9] * \ $ regex.

my $query = " 
     SELECT wtg_uid, pat_first_name, pat_last_name, pat_chi_no, 
     wtg_scantype, wtg_confirmed, 
     std_in_out_patient, 
     inc_uid, wtg_appeared, 
     myo_maps_study, myx_event, 
     inc_incident_required, inc_incident_done, 
     inc_gp_letter_required, inc_gp_letter_done, 
     inc_reappt_required, inc_reappt_done, 
     inc_comment 
     FROM ((waiting INNER JOIN patients ON (wtg_pat_uid = pat_uid)) 
     LEFT OUTER JOIN studies ON (wtg_uid = std_wtg_uid) 
     LEFT OUTER JOIN myx ON (std_uid = myx_std_uid) 
     LEFT OUTER JOIN myo on (std_uid = myo_std_uid)) 
     LEFT OUTER JOIN incidents ON (wtg_uid = inc_wtg_uid) 
     WHERE wtg_scan_date = '$date' AND myo_maps_study ~ 'MYO[0-9]*\$' 
     ORDER BY pat_last_name;"; 

retours

17291 | AR   | MAX  | 1609 | E-R AND RNVG |    | O     |   | Y   | MYO130430  | 
     |      |     |      |     |      |     | 
    17201 | ANN  | MCK  | 3011 | E-R AND RNVG |    | O     |   | Y   | MYO134416  | 
     |      |     |      |     |      |     | 

Lorsque je supprime la condition de myo_maps_study

SELECT wtg_uid, pat_first_name, pat_last_name, pat_chi_no,wtg_scantype, wtg_confirmed, std_in_out_patient, inc_uid, wtg_appeared, myo_maps_study, myx_event,inc_incident_required, inc_incident_done,inc_gp_letter_required, inc_gp_letter_done,inc_reappt_required, inc_reappt_done,inc_comment FROM ((waiting INNER JOIN patients ON (wtg_pat_uid = pat_uid)) LEFT OUTER JOIN studies ON (wtg_uid = std_wtg_uid) LEFT OUTER JOIN myx ON (std_uid = myx_std_uid) LEFT OUTER JOIN myo on (std_uid = myo_std_uid)) LEFT OUTER JOIN incidents ON (wtg_uid = inc_wtg_uid) WHERE wtg_scan_date = '19/08/13' ORDER BY pat_last_name; 

je reçois

17264 | KIS  | ASH  | 150 | E-R AND RNVG |    |     |   | Y   |    | 
     |      |     |      |     |      |     | 
    17262 | WIL  | BE   | 1301 | E-R AND RNVG |    |     |   |    |    | 
     |      |     |      |     |      |     | 
    17268 | ELI  | HAR  | 2105 | E-R AND RNVG |    |     |   |    |    | 
     |      |     |      |     |      |     | 
    17291 | AR   | MAX  | 1609 | E-R AND RNVG |    | O     |   | Y   | MYO130430T  | 
     |      |     |      |     |      |     | 
    17291 | AR   | MAX  | 1609 | E-R AND RNVG |    | O     |   | Y   | MYO130430  | 
     |      |     |      |     |      |     | 
    17201 | ANN  | MCK  | 3011 | E-R AND RNVG |    | O     |   | Y   | MYO134416T  | 
     |      |     |      |     |      |     | 
    17201 | ANN  | MCK  | 3011 | E-R AND RNVG |    | O     |   | Y   | MYO134416  | 
     |      |     |      |     |      |     | 
    17351 | SHI  | MUL  | 2907 | R-R ONLY  |    |     |   |    |    | 
     |      |     |      |  

Avis à la deuxième requête AR MAX et ANN MCK apparaissent deux fois. Ma sortie désirée est quelque chose entre. Je veux que chaque personne apparaisse une seule fois avec chaque requête. si une myo_maps_study existe, elle doit être celle avec le format MYO[0-9]*\$. Pour les personnes sans myo_maps_study je veux que la ligne soit sortie avec le champ vide

Comment est-ce que je peux faire ceci?

Répondre

1
select distinct on (pat_last_name, pat_first_name) 
    wtg_uid, pat_first_name, pat_last_name, pat_chi_no, 
    wtg_scantype, wtg_confirmed, 
    std_in_out_patient, 
    inc_uid, wtg_appeared, 
    myo_maps_study, myx_event, 
    inc_incident_required, inc_incident_done, 
    inc_gp_letter_required, inc_gp_letter_done, 
    inc_reappt_required, inc_reappt_done, 
    inc_comment 
from 
    (
     waiting 
     inner join 
     patients on wtg_pat_uid = pat_uid 
     left outer join 
     studies on wtg_uid = std_wtg_uid 
     left outer join 
     myx on std_uid = myx_std_uid 
     left outer join 
     myo on std_uid = myo_std_uid 
    ) 
    left outer join incidents on wtg_uid = inc_wtg_uid 
where 
    wtg_scan_date = '$date' 
    and 
    (myo_maps_study ~ 'myo[0-9]*\$' or myo_maps_study is null) 
order by pat_last_name 
+0

Fantastique merci – moadeep

0

Que diriez-vous de remplacer

AND myo_maps_study ~ 'MYO[0-9]*\$' 

par

AND (myo_maps_study ~ 'MYO[0-9]*\$' OR myo_maps_study = '') 
+0

J'ai essayé et cela me donne le même résultat que la première requête. Je pense que c'est parce que la condition jointe 'LEFT OUTER JOIN myo on (std_uid = myo_std_uid))' échouera car aucun MYO n'existera à ce point. Bien qu'il fera probablement plus tard dans la journée – moadeep