CASE 表达式内的 INT 列上的 ORDER BY 无法正常工作

问题描述 投票:0回答:1

我有一张看起来像这样的桌子

some_table (
    item_id varchar(10) null,
    item_title varchar(200) null,
    item_url varchar(200) null,
    item_status char default '0' null,
    access_count int null,
    created_by varchar(100) default 'system' not null,
    created_date timestamp default CURRENT_TIMESTAMP not null
)

当我尝试执行以下SQL时,结果顺序不正确,例如91在912之后。

SET @orderCol = 'accessCount';
SELECT
    t.item_status,
    t.item_id,
    t.item_title,
    t.item_url,
    t.access_count
FROM some_table t
WHERE DATE(t.created_date) = DATE(NOW())
ORDER BY CASE
    WHEN (@orderCol = 'itemStatus') THEN t.item_status
    WHEN (@orderCol = 'itemId') THEN t.item_id
    WHEN (@orderCol = 'itemTitle') THEN t.item_title
    WHEN (@orderCol = 'itemUrl') THEN t.item_url
    WHEN (@orderCol = 'accessCount') THEN t.access_count 
END DESC
LIMIT 0, 30

我应该怎么做才能解决这个问题?

mysql sql case
1个回答
3
投票

您在

CASE
表达式 中混合数据类型,它在这里表示:

CASE表达式结果的返回类型是聚合类型 所有结果值。

在您的示例中,返回类型为

VARCHAR(200)
;能够存储所有可能值的最大数据类型。这解释了为什么您的数字被排序为字符串。更好的解决方案是对列分别进行排序;仅当它们兼容时才合并:

ORDER BY
    -- string columns
    CASE
        WHEN (@orderCol = 'itemStatus') THEN t.item_status
        WHEN (@orderCol = 'itemId') THEN t.item_id 
        WHEN (@orderCol = 'itemTitle') THEN t.item_title 
        WHEN (@orderCol = 'itemUrl') THEN t.item_url 
    END,
    -- numeric columns
    CASE
        WHEN (@orderCol = 'accessCount') THEN t.access_count
    END

当没有任何

WHEN
子句匹配时,第一个人造列将完全由 NULL 值组成;在这种情况下(关系)使用第二个人造列。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.