将带有字母的数字转换为负数SSIS

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

我正在将平面文件导入到 SQL 数据库中。所述平面文件是由旧软件生成的,该软件无法存储负数,因此使用字母代替。 p=0、q=1、r=2 等,然后因为您找到/替换了一个字母,所以您乘以 -1。因此,如果我得到 14q,则需要将其转换为 -141。我觉得类型转换将是其中最棘手的部分,因为我需要将它们作为字符串导入,然后在替换字母后乘以 -1。

无论您替换为什么数字,都会乘以 -1。

  • 14p=-140
  • 14q=-141
  • 14r=-142
  • 140=140
sql-server ssis
2个回答
1
投票

这听起来像是一个“有趣”的问题。在从旧程序中研究了许多...创造性的空间节省解决方案后,我感觉是的。

听起来该模式可能是带有可选后缀的数字。

将该列作为字符串引入数据流。

使用派生列创建一个名为

Suffix

的新列
right(myColumn,1)

现在我们在数据流中有列,它可能是数字,也可能是字符,所以我们必须检查它并做出决定。考虑到值的范围有限,我将使用查找组件并使用以下查询

SELECT 
*
FROM
(
    VALUES
        (N'p', '0', -1)
    ,   (N'q', '1', -1)
    ,   (N'r', '2', -1)
    ,   (N's', '3', -1)
    ,   (N't', '4', -1)
    ,   (N'u', '5', -1)
    ,   (N'v', '6', -1)
    ,   (N'w', '7', -1)
    ,   (N'x', '8', -1)
    ,   (N'y', '9', -1)
    ,   (N'0', '0', 1)
    ,   (N'1', '1', 1)
    ,   (N'2', '2', 1)
    ,   (N'3', '3', 1)
    ,   (N'4', '4', 1)
    ,   (N'5', '5', 1)
    ,   (N'6', '6', 1)
    ,   (N'7', '7', 1)
    ,   (N'8', '8', 1)
    ,   (N'9', '9', 1)
)D(Suffix, Digit, Multiplier);

我们将在查找中将数据流中的后缀与 lkp_Suffix 进行匹配,从而返回 lkp_Digit 和 lkp_Multiplier 值。

添加另一个派生列,这将通过字符串操作构建我们的新“数字”。我们称此为

myIntermediateColumn

left(myColumn, len(myColumn) -1) + lkp_Digit

添加第三个派生列。这会将我们的中间列转换为数字并执行数学运算使其变为负数(或非负数)。就叫它

myActualNumber

(DT_I4) myIntermediateColumn * lkp_Digit

如果一切都已排好,我们就从原始列中删除最后一个角色。使用查找将 1 值转换为 2:它表示的数字以及我们将用来相应翻转符号的值。我们创建了一个新列,用我们查找的值替换最后一个字符。最后,我们创建另一列,将数据类型转换回数字,并进行数学运算以适当地设置符号。将该列放入您的表格中

数据集中的 NULL 或空字符串会让您感到困惑,但多派生列方法的好处是您可以在它们之间设置一个...数据检查器来识别任务错误的位置。您可以通过更少的步骤来完成此操作,但代价是可维护性。


0
投票
似乎您可以使用

TRANSLATE

 将最后一个“数字”(字母)更改为正确的数字,然后将该值乘以 
-1
1
,具体取决于字母 p-y 是否出现在字符串中:

SELECT V.YourNotInt, TRY_CONVERT(int,TRANSLATE(V.YourNotInt,'pqrstuvwxy','0123456789')) * CASE WHEN V.YourNotInt LIKE '%[p-y]' THEN -1 ELSE 1 END AS YourInt FROM (VALUES('14p'), ('4q'), ('52'), ('35r'))V(YourNotInt);
    
© www.soinside.com 2019 - 2024. All rights reserved.