2013-08-27 4 views
1

Je tente de créer des données d'adresse à partir d'un certain nombre de tables différentes et d'obtenir deux jeux de données renvoyés à l'aide d'une requête UNION pour supprimer les doublons. Je construis l'instruction SQL suivante en PHPUtilisation de IF imbriqué dans une instruction mySQL SELECT

$query = " 
    SELECT 
    l.UPRN, 
    (CONCAT(IF(o.ORGANISATION IS NULL, '', CONCAT(o.ORGANISATION, ' ')), 
     IF(l.SAO_TEXT IS NULL, '', CONCAT(l.SAO_TEXT, ' ')), 
     IF(l.SAO_START_NUMBER <> 0, SAO_START_NUMBER, ''), 
     IF(l.SAO_START_SUFFIX IS NULL, '', SAO_START_SUFFIX), 
     IF(l.SAO_END_NUMBER <> 0, CONCAT('-', SAO_END_NUMBER), ''), 
     IF(l.SAO_END_SUFFIX IS NULL, '', l.SAO_END_SUFFIX), 
     IF(l.PAO_TEXT IS NULL, '', CONCAT(' ', l.PAO_TEXT, ' ')), 
     IF(l.PAO_START_NUMBER <> 0, PAO_START_NUMBER, ''), 
     IF(l.PAO_START_SUFFIX IS NULL, '', PAO_START_SUFFIX), 
     IF(l.PAO_END_NUMBER <> 0, CONCAT('-', PAO_END_NUMBER), ''), 
     IF(l.PAO_END_SUFFIX IS NULL, '', l.PAO_END_SUFFIX), 
     IF(s.STREET_DESCRIPTION IS NULL, '', 
     CONCAT(' ', s.STREET_DESCRIPTION, ' ')), 
     IF(s.LOCALITY_NAME IS NULL, '', CONCAT(s.LOCALITY_NAME, ' ')), 
     IF(s.TOWN_NAME IS NULL, '', CONCAT(s.TOWN_NAME, ' ')), 
     IF(s.ADMINISTRATIVE_AREA IS NULL, '', 
     CONCAT(s.ADMINISTRATIVE_AREA, ' ')), 
     b.postcode_locator) 
    ) AS single_address_label 
    FROM addbaseprem.abp_lpi l 
    INNER JOIN addbaseprem.abp_blpu b 
     ON b.UPRN = l.UPRN 
    INNER JOIN addbaseprem.abp_street_descriptor s 
     ON s.USRN = l.USRN 
    LEFT JOIN addbaseprem.abp_organisation o 
     ON o.UPRN = l.UPRN 
    WHERE l.LOGICAL_STATUS = 1 
"; 

Il fonctionne assez bien dans ce que je reçois mon UPRN et colonnes single_address_label retourné. Je vais avoir un problème avec la partie suivante si

IF(s.ADMINISTRATIVE_AREA IS NULL,'',CONCAT(s.ADMINISTRATIVE_AREA,' ')), 

Ce que je voudrais arriver est de ne pas concat la valeur ADMINISTRATIVE_AREA si elle est la même que la valeur de TOWN_NAME par exemple, je voudrais quelque chose comme

IF(s.ADMINISTRATIVE_AREA IS NULL,'',IF((s.ADMINISTRATIVE_AREA == s.TOWN_NAME),'',CONCAT(s.ADMINISTRATIVE_AREA,' ')), 

J'ai essayé quelques variantes de OR! = Et ainsi de suite mais en vain - je n'arrive pas à trouver le bon code et je continue à avoir une erreur de syntaxe. Je ne sais pas si j'essaie de faire quelque chose qui n'est tout simplement pas possible ou de commettre une erreur d'écolier. Il a fallu du temps pour arriver jusque là ...

Toute aide ou conseil reçu avec gratitude.

Répondre

1

Essayez:

IF(s.ADMINISTRATIVE_AREA IS NULL OR s.ADMINISTRATIVE_AREA = s.TOWN_NAME,'',CONCAT(s.ADMINISTRATIVE_AREA,' ')) 

Vous pouvez également simplifier la plupart des morceaux en utilisant IFNULL:

IFNULL(column, '') 

équivaut à:

IF(column IS NULL, '', column) 
+0

merci. fonctionne bien. ne peux pas comprendre comment je ne pouvais pas voir cela hier soir – user1576265

Questions connexes