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

Posted

技术标签:

【中文标题】在 mySQL SELECT 语句中使用嵌套的 IF【英文标题】:using nested IF in mySQL SELECT statement 【发布时间】:2013-08-29 14:09:42 【问题描述】:

我正在尝试从许多不同的表中构建一些地址数据,并使用 UNION 查询来删除重复的两个返回的数据集。我正在 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
";

它工作得很好,因为我正在返回我的 UPRN 和 single_address_label 列。我在下面的部分遇到了问题

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

如果 ADMINISTRATIVE_AREA 值与 TOWN_NAME 值相同,我希望不要连接它,例如我想要类似的东西

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

我尝试了 OR != 等的几种变体,但无济于事 - 我似乎无法正确编写代码并不断收到语法错误。我不知道我是在尝试做一些不可能的事情,还是只是在犯一个小学生的错误。走到这一步花了相当长的时间......

感谢所有帮助或建议。

【问题讨论】:

【参考方案1】:

试试:

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

您还可以使用 IFNULL 来简化许多部分:

IFNULL(column, '')

相当于:

IF(column IS NULL, '', column)

【讨论】:

谢谢。工作正常。无法理解我昨晚怎么看不到这一点

以上是关于在 mySQL SELECT 语句中使用嵌套的 IF的主要内容,如果未能解决你的问题,请参考以下文章

MySql语句中select可以嵌套么,字段的重命名可以用中文么

MySQL—— 子查询

TYPO3 DBAL Querybuilder:嵌套的 SELECT 语句?

mysql中insert与select的嵌套使用解决组合字段插入问题

HAVING 语句中能嵌套SELECT查询语句吗?

SQL 语句Oracle :select嵌套: