sql >> Database teknologi >  >> RDS >> Mysql

MySQL - sorter kommasepareret streng i kolonne

Det er muligt, men ikke rigtig en god idé.

Som et eksempel kan du opdele en kommasepareret liste ved at generere en række tal og bruge det med SUBSTRING_INDEX for at få hvert element. Udvalget af tal skal dog være lige så stort som det maksimale antal afgrænsede værdier.

Du kan derefter bruge GROUP_CONCAT til at samle listen igen i den rigtige rækkefølge. Bemærk, at rækkefølgen vil være forskellig afhængig af, om du har castet de opdelte værdier som tal/heltal eller efterladt dem som strenge.

SELECT id, title, GROUP_CONCAT(aNumber ORDER BY aNumber) FROM ( SELECT id, title, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(numbers, ',', tens.acnt * 10 + units.acnt + 1), ',', -1) AS UNSIGNED) AS aNumber FROM some_table CROSS JOIN (SELECT 0 AS acnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units CROSS JOIN (SELECT 0 AS acnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens WHERE LENGTH(numbers) - LENGTH(REPLACE(numbers, ',', '')) >= tens.acnt * 10 + units.acnt ) sub0 GROUP BY id, title;

Demonstreret her på SQL violin (hvis SQL violin beslutter at virke):-

http://www.sqlfiddle.com/#!9/c9703ee/4

Det første valg er at caste værdierne som heltal for at sortere dem numerisk, den anden caster dem ikke, men bare efterlader dem som strenge, derfor er sorteringsrækkefølgen anderledes.




  1. PL/SQL Performance Tuning for LIKE '%...%' Wildcard-forespørgsler

  2. Sikkerhedsfunktioner i SQL Server 2017

  3. Hvordan opretter jeg en lagret procedure, der valgfrit vil søge i kolonner?

  4. Hvordan får man en primær nøgle til at starte fra 1000?