查询以使用 GROUP_CONCAT 拆分偶数和奇数

Jer*_*een 1 mysql sql mariadb

我有一个查询,可以在具有四个数字的特定邮政编码中查找每条街道的门牌号码:

SELECT *,
    GROUP_CONCAT(DISTINCT CAST(housenumber AS int) ORDER BY housenumber ASC) AS housenumbers
FROM streets
WHERE postcode LIKE '3031%'
GROUP BY street
ORDER BY lat,lon
Run Code Online (Sandbox Code Playgroud)

这是 groupcatted 门牌号码的结果。

491,492,493,500,501,502,503,504,505,506,507,508,50
Run Code Online (Sandbox Code Playgroud)

我想将结果分成两列,分别为evenhousenumber 和oddhousenumbers。我试过MODand %2,但都需要 aWHERE并且不可能WHERE在 groupcat 函数中使用 ,我注意到。

如何将结果拆分为偶数和奇数?

Luk*_*zda 5

你可以使用CASE表达式:

SELECT street
 ,GROUP_CONCAT(DISTINCT CASE WHEN MOD(CAST(housenumber AS int),2) = 0 THEN CAST(housenumber AS int) END ORDER BY housenumber ASC) AS housenumbers_even
 ,GROUP_CONCAT(DISTINCT CASE WHEN MOD(CAST(housenumber AS int),2) = 1 THEN CAST(housenumber AS int) END ORDER BY housenumber ASC) AS housenumbers_odd
FROM streets
WHERE postcode LIKE '3031%'
GROUP BY street
ORDER BY lat,lon;
Run Code Online (Sandbox Code Playgroud)

它有效,因为GROUP_CONCAT跳过NULL值。


SELECT * ... GROUP BY street并不安全。相关:mySQL 和 postgreSQL 中的 Group by 子句,为什么 postgreSQL 中出现错误?

  • @JeroenSteen 几乎所有聚合函数 sklp null 值(仅当遇到的每个值都是 null 时才产生 null)。 (3认同)