【问题】
I have this data in my table and I want to sort it using the numbers in the data.
Data unsorted
5 team team team team
team team team 2 team
team team team team 4
team 1 team team team
team team 3 team team
Data Sorted
team 1 team team team
team team team 2 team
team team 3 team team
team team team team 4
5 team team team team
有人给出解答,楼主没回复
Create this function:
CREATE FUNCTION IsNumeric (val varchar(255)) RETURNS tinyint
RETURN val REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';
CREATE FUNCTION GetNumericOnly (val VARCHAR(255))
RETURNS VARCHAR(255)
BEGIN
DECLARE idx INT DEFAULT 0;
IF ISNULL(val) THEN RETURN NULL; END IF;
IF LENGTH(val) = 0 THEN RETURN ""; END IF;
SET idx = LENGTH(val);
WHILE idx > 0 DO
IF IsNumeric(SUBSTRING(val,idx,1)) = 0 THEN
SET val = REPLACE(val,SUBSTRING(val,idx,1),"");
SET idx = LENGTH(val)+1;
END IF;
SET idx = idx - 1;
END WHILE;
RETURN val;
END;
Then use it like this:
SELECT * FROM mixedvalues
ORDER BY GetNumericOnly(value)
【回答】
SQL做这种动态列的运算很不方便,如果没特别要求,建议读出来用SPL来做,把记录转成数组再取了数值类型的字段排序即可,代码简单也易懂:
| A | |
| 1 | $select * from tb |
| 2 | =A1.sort(~.array().select(ifnumber(~))) |
A1:从表tb取数
A2:将每条记录的字段值转为序列,从该序列中取出数值成员作为A1的排序表达式进行排序
写好的脚本如何在应用程序中调用,可以参考Java 如何调用 SPL 脚本
更多动态列的例子可参考Examples of esProc’s Assisting in Dynamic-Column-SQL Computations – Raqsoft Blog
SQL排序与动态列处理
本文介绍了如何在SQL中处理包含数字的字符串数据并进行排序。通过创建IsNumeric和GetNumericOnly两个函数,可以提取并排序混合数据中的数值部分。然而,对于复杂情况,建议使用如SPL这样的脚本语言,将数据读出后进行处理,这样代码更简洁易懂。此外,还提供了一个SPL脚本示例来演示如何实现这个功能。
686

被折叠的 条评论
为什么被折叠?



