简体   繁体   English

在mySQL SELECT语句中使用嵌套的IF

[英]using nested IF in mySQL SELECT statement

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. 我正在尝试从多个不同的表中构建一些地址数据,并使用UNION查询删除两个重复的数据集。 I am building the following SQL statement in PHP 我正在用PHP构建以下SQL语句

$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. 由于我得到了我的UPRN和single_address_label列,因此它工作得很好。 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 如果与TOWN_NAME值相同,我想不要CONCAT ADMINISTRATIVE_AREA值,例如,我想要

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. 我尝试了OR!=的一些变体,等等,但无济于事-我似乎无法正确获取代码并不断收到语法错误。 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. 感谢收到所有帮助或建议。

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简化许多步骤:

IFNULL(column, '')

is equivalent to: 等效于:

IF(column IS NULL, '', column)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM