Question

I am trying to build some address data from a number of different tables and come up with two returned datasets using a UNION query to remove duplicates. I am building the following SQL statement in PHP

$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
";

It is working pretty well in that I am getting my UPRN and single_address_label columns returned. I'm having a problem with the following part though

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

What I would like to happen is not to CONCAT the ADMINISTRATIVE_AREA value if it is the same as the TOWN_NAME value eg i would like something like

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

I have tried a few variations of OR != and so on but to no avail - I can't seem to get the code right and keep getting a syntax error. I don't know if I'm trying to do something that's just not possible or just making a schoolboy mistake. It's taken quite a time to get this far...

All help or advice gratefully received.

Was it helpful?

Solution

Try:

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

You can also simplify many of the pieces by using IFNULL:

IFNULL(column, '')

is equivalent to:

IF(column IS NULL, '', column)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top