首页 > 解决方案 > T-SQL 拆分列结果并对结果进行数学运算

问题描述

我有一张像这样的文件大小的表格

FileSize
68 bytes
122.80 Kb
23.5 Mb
1.2 Gb

我需要选择 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'&amp;'),N'<',N'&lt;'),N'>',N'&gt;'),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 中的“度量”列值对“大小”列值进行转换?

标签: sqltsql

解决方案


一种方法是用于CHARINDEX获取空间的位置并将值拆分为 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)

推荐阅读