sql - 对包含整数的 VARCHAR 列进行排序
问题描述
我有这张桌子:
IF OBJECT_ID('tempdb..#Test') IS NOT NULL
DROP TABLE #Test;
CREATE TABLE #Test (Col VARCHAR(100));
INSERT INTO #Test
VALUES ('1'), ('2'), ('10'), ('A'), ('B'), ('C1'), ('1D'), ('10HH')
SELECT * FROM #Test
我想先按数值排序,然后按字母顺序排序。
我想要的结果是:
1
1D
2
10
10HH
A
B
C1
假设条目结构是其中之一(当然没有破折号)
number
number-string
string-number
string
如果有类似 string-number-string 的条目,假设它是 string-number
解决方案
它不漂亮,但它有效。
SELECT T.Col
FROM #Test T
CROSS APPLY (VALUES(PATINDEX('%[^0-9]%',T.Col)))PI(I)
CROSS APPLY (VALUES(TRY_CONVERT(int,NULLIF(ISNULL(LEFT(T.Col,NULLIF(PI.I,0)-1),LEN(T.Col)),''))))TC(L)
ORDER BY CASE WHEN TC.L IS NULL THEN 1 ELSE 0 END,
TC.L,
T.Col;
老实说,我建议如果您想像数值一样对数据进行排序,您实际上将数值存储在数值列中;显然上面应该是一个数字前缀值,然后是字符串后缀。然后,如果您想要拥有您拥有的值,请使用 ( PERSISTED
) 计算列。像这样:
CREATE TABLE #Test (Prefix int NULL,
Suffix varchar(100) NULL,
Col AS CONCAT(Prefix, Suffix) PERSISTED);
INSERT INTO #Test (Prefix, Suffix)
VALUES (1,NULL), (2,NULL), (10,NULL), (NULL,'A'), (NULL,'B'), (NULL,'C1'), (1,'D'), (10,'HH');
SELECT Col
FROM #Test
ORDER BY CASE WHEN Prefix IS NULL THEN 1 ELSE 0 END,
Prefix,
Suffix;
推荐阅读
- google-cloud-platform - 使用 Ansible,如何启动当前停止的 GCP VM 实例?
- neo4j - 在大图中获取特定路径的开始和结束节点
- azure-active-directory - Azure AD 非图库企业应用程序通过 Powershell 脚本
- image-processing - 证明两个灰度图像相同与否
- powershell - 抑制 Powershell 命令的输出
- service-worker - 如何有条件地缓存工作箱中的 API
- python - (已解决)我无法在嵌套的 while 循环中访问变量
- c# - c# 任务(Windows Mobile 5.0 上的 .net 2.0)传递参数不像预期的那样工作
- c++ - 按下时将参数传递给按钮的函数(C++,GTKMM)
- go - sync.WaitGroup.Done() 如何实际工作?