[英]T-SQL to split column results and do maths on the result
我有一张像这样的文件大小的表格
FileSize
68 bytes
122.80 Kb
23.5 Mb
1.2 Gb
我需要 SELECT 以 Mb 为单位的结果,所以结果看起来像
Converted FileSize
0.000068
0.1228
23.5
1200
这会正确拆分结果
WITH Splitted AS
(
SELECT CAST(N'<x>' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE([File Size],N' ',N' '),N'&',N'&'),N'<',N'<'),N'>',N'>'),N' ',N'</x><x>') + N'</x>' AS XML) testXML
FROM Attachment
)
SELECT testXML.value('/x[1]','float') AS Number
,testXML.value('/x[2]','nvarchar(max)') AS metric
FROM Splitted
至
Size Metric
68 bytes
122.8 Kb
23.5 Mb
1.2 Gb
有没有办法根据 SQL 中的“公制”列值对“大小”列值进行转换?
一种方法是使用CHARINDEX
获取空间的 position 并将值拆分为 2 列。 然后使用CASE
表达式将值乘以适当的数量:
WITH YourTable AS(
SELECT V.FileSize
FROM (VALUES('68 bytes'),
('122.80 Kb'),
('23.5 Mb'),
('1.2 Gb'))V(FileSize))
SELECT *,
V.[Size] * CASE V.Metric WHEN 'bytes' THEN 1. / (1024 * 1024)
WHEN 'Kb' THEN 1. / 1024
WHEN 'Mb' THEN 1
WHEN 'Gb' THEN 1024
END AS Megabytes
FROM YourTable YT
CROSS APPLY(VALUES(TRY_CONVERT(decimal(10,4),LEFT(YT.FileSize,NULLIF(CHARINDEX(' ',YT.FileSize),0)-1)),STUFF(YT.FileSize,1,NULLIF(CHARINDEX(' ',YT.FileSize),0),'')))V(Size,Metric)
基于以上我标记为答案的内容,这就是我使用过的。
SELECT [File Type], [File Size],
CAST( A.Size * CASE A.Metric WHEN 'bytes' THEN 1.0 / (1024 * 1024)
WHEN 'Kb' THEN 1.0 / 1024
WHEN 'Mb' THEN 1
WHEN 'Gb' THEN 1024
END as NUMERIC(10, 2))AS Megabytes
FROM Attachment AA
CROSS APPLY(
VALUES( TRY_CONVERT(decimal(10,4),LEFT(AA.[File Size], NULLIF(CHARINDEX(' ',AA.[File Size]),0)-1)),
STUFF(AA.[File Size],1,NULLIF(CHARINDEX(' ',AA.[File Size]),0),''))
)A (Size, Metric)
WHERE AA.[File Type] IS NOT NULL
ORDER BY Megabytes ASC
File type File size Megabytes
txt 68 bytes 0.00
txt 68 bytes 0.00
PDF 122.80 KB 0.12
PDF 122.80 KB 0.12
txt 23.5 Mb 23.50
PDF 1.2 Gb 1228.80
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.