T-SQL拆分列结果并对结果进行数学运算

T-SQL拆分列结果并对结果进行数学运算,sql,tsql,Sql,Tsql,我有一张表,里面有这么多文件 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' '

我有一张表,里面有这么多文件

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

有没有办法根据SQL中的度量列值对大小列值进行转换?

一种方法是使用CHARINDEX获取空间的位置,并将值拆分为两列。然后使用大小写表达式将值乘以适当的数量:

以你的桌子为例 选择V.FileSize 从值'68字节', “122.80 Kb”, “235MB”, “1.2 Gb”文件大小 选择*, V.[Size]*案例V.度量值,当“字节”然后为1./1024 * 1024 当'Kb'时,则为1。/1024 当'Mb'时,则为1 当'Gb'时,则为1024 以兆字节结束 从你的桌子上 交叉APPLYVALUESTRY\u CONVERTdecimal10,4,LEFTYT.FileSize,NULLIFCHARINDEX“”,YT.FileSize,0-1,STUFFYT.FileSize,1,NULLIFCHARINDEX“”,YT.FileSize,0,VSize,公制
根据上面我标记的答案,这就是我使用的

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

您希望转换什么类型的尺寸?有什么逻辑吗?只是转换成MbPerfect,谢谢
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