我正在尝试从许多不同的表构建一些地址数据,并使用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,' ')),
我想要发生的是,如果它与TOWN_NAME值相同,则不会收集ADMINISTRATIVE_AREA值,例如我希望
IF(s.ADMINISTRATIVE_AREA IS NULL,'',IF((s.ADMINISTRATIVE_AREA == s.TOWN_NAME),'',CONCAT(s.ADMINISTRATIVE_AREA,' ')),
我尝试过OR!=等等的一些变体但是无济于事 - 我似乎无法正确获取代码并且不断出现语法错误。我不知道我是在尝试做一些不可能的事情,还是只是犯了一个小学生的错误。到目前为止已经花了很长时间......
感谢所有帮助或建议。
答案 0 :(得分: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)