合并多个CAST?

问题描述 投票:0回答:1

我有一个文件,其中所有内容均为 nvarchar,包括所有数字,并且没有小数,因此“12.35”将仅存储为“1235”。然后我需要它输出小数点后 4 位。

我不能只除以小数。虽然很丑,但是这个很管用。

SELECT CAST(CAST(rso.[NET_PRICE]    AS Decimal(20,4)) / 10)    AS Decimal(20,4) AS [Net Price]
SELECT CAST(CAST(rso.[Unit_Price]   AS Decimal(20,4)) / 10000) AS Decimal(20,4) AS [Unit Price]

有没有办法结合CAST或者其他东西来提高效率?我有大约 2000 万条记录,每条记录大约有 40 条,所以它们正在消耗周期。

sql sql-server casting decimal
1个回答
0
投票

简短回答:不,没有更好的选择。

长答案:这取决于结果是什么以及隐式与显式。

这一切都取决于哪些源数据可以隐式转换为“正确”值,即使间歇性隐式转换选择最“合适”的类型。这可能不适用于某些外围值。

所示的简单测试数据和输出:

DECLARE
  @Rows
  TABLE
(
  SomeColumn    nvarchar(12)
)
;
INSERT INTO
  @Rows
VALUES
  ( N'123456' )
, ( N'4201' )
, ( N'123456789012' ) -- 1234567890123 yields truncation error
, ( N'-12345678901' ) -- -123456789012 yields truncation error
, ( N'NaN' )
;

SELECT
  SomeColumn AS OriginalString
, TRY_CAST( SomeColumn AS decimal(20,4) ) AS DecimalValue
, TRY_CAST( SomeColumn AS decimal(20,4) ) / 100 AS CalculatedSimpleValue
, CONVERT( decimal(20,4), TRY_CONVERT( decimal(20,5), SomeColumn ) / 100 ) AS CalculatedDoubleValue
FROM
  @Rows
;

结果是:

OriginalString  DecimalValue        CalculatedSimpleValue   CalculatedDoubleValue
123456          123456.0000         1234.56000000           1234.5600
4201            4201.0000           42.01000000             42.0100
123456789012    123456789012.0000   1234567890.12000000     1234567890.1200
-12345678901    -12345678901.0000   -123456789.01000000     -123456789.0100

第三列显示了转换后的计算将类型转换为十进制 20 以外的其他值(保留 4 位小数)。

但是,由于这种转换代码生成结构(在 Excel 中)非常快,我喜欢 Excel 来执行这些任务的功能复制列向下功能。

最终技术说明:在处理字符列作为输入时使用 TRY_CONVERT 或 TRY_CAST,以免在 2000 万行转换工作中失败。

© www.soinside.com 2019 - 2024. All rights reserved.