You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:18:56