我有一张类似
的表格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之后出现。
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
我该怎么做才能解决这个问题?
答案 0 :(得分:1)
您正在CASE
expression内混合数据类型,并在此处说明:
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
包含all-NULL值的虚拟列不会影响排序。