如何对SQL表中单个单元格内的单词进行排序?
刚好搞定过类似的需求,给你分享几个主流SQL数据库的解决方案,直接就能套用!
你的需求核心是把单个单元格内的空格分隔单词按字典序(数字在前)重新排序后拼接,先看示例对应效果:
原内容:Pillars 101 in an apartment Zuzu Durga International Hotel Wyndham Garden Fresh Meadows
排序后:101 an apartment in Pillars Durga Hotel International Zuzu Fresh Garden Meadows
下面分数据库给出具体实现:
MySQL 8.0+ 解法(递归CTE)
MySQL 8.0及以上支持递归CTE,不用创建自定义函数就能实现:
-- 先处理多余空格,再拆分、排序、拼接 WITH RECURSIVE split_words AS ( SELECT id, -- 替换多个连续空格为单个 REGEXP_REPLACE(content, '\\s+', ' ') AS cleaned_content, 1 AS pos, SUBSTRING_INDEX(REGEXP_REPLACE(content, '\\s+', ' '), ' ', 1) AS word, SUBSTRING(REGEXP_REPLACE(content, '\\s+', ' '), LENGTH(SUBSTRING_INDEX(REGEXP_REPLACE(content, '\\s+', ' '), ' ', 1)) + 2) AS remaining FROM your_table UNION ALL SELECT id, cleaned_content, pos + 1, SUBSTRING_INDEX(remaining, ' ', 1) AS word, SUBSTRING(remaining, LENGTH(SUBSTRING_INDEX(remaining, ' ', 1)) + 2) AS remaining FROM split_words WHERE remaining != '' ) SELECT id, -- 按单词排序后拼接,数字会因为ASCII值更小自动排在前面 GROUP_CONCAT(word ORDER BY word SEPARATOR ' ') AS sorted_content FROM split_words GROUP BY id;
PostgreSQL 解法(数组函数)
PostgreSQL的数组操作非常便捷,几行代码就能搞定:
SELECT id, array_to_string( ARRAY( -- 拆分字符串为数组,拆分行后排序 SELECT unnest(string_to_array(REGEXP_REPLACE(content, '\\s+', ' ', 'g'), ' ')) ORDER BY unnest ), ' ' ) AS sorted_content FROM your_table;
SQL Server 2017+ 解法(STRING_SPLIT + STRING_AGG)
SQL Server 2017及以上支持STRING_AGG,结合STRING_SPLIT实现:
SELECT t.id, -- 拆分后按单词排序并拼接 STRING_AGG(s.value, ' ') WITHIN GROUP (ORDER BY s.value) AS sorted_content FROM your_table t CROSS APPLY STRING_SPLIT(REGEXP_REPLACE(t.content, '\\s+', ' ', 'g'), ' ') s -- 过滤拆分出的空字符串(处理开头/结尾空格) WHERE s.value != '' GROUP BY t.id;
额外优化点
如果需要数字按数值排序(比如2排在10前面,而不是字符排序的10在前),可以修改排序逻辑,以MySQL为例:
GROUP_CONCAT(word ORDER BY -- 数字排在字母前面 CASE WHEN word REGEXP '^[0-9]+$' THEN 0 ELSE 1 END, -- 数字按数值排序,字母按字典序 CASE WHEN word REGEXP '^[0-9]+$' THEN CAST(word AS UNSIGNED) ELSE word END SEPARATOR ' ') AS sorted_content
内容的提问来源于stack exchange,提问作者Abynez
相关产品推荐
相关产品推荐

