2016-07-05 39 views
2

我有一个临时表与列LastAnalysisAmountvarchar数据类型),其包含这样的值:SQL函数改变列格式

LastAnalysisAmount 
-------------------  
    0000000.00 
    0000114.77- 
    0000367.78 
    0290367.45 
    0090367.26- 

该列包含正和负数。我需要将此LastAnalysisAmount列值转换为正确格式的十进制数并将其加载到目标表中。

例如,在目标表,值应该

 0.00 
    -114.77 
    367.78 
290367.45 
-90367.26 

能否请你帮我写一个SQL函数来完成这种转换?

谢谢你的帮助和时间。

+1

是数据是现在的这个样子'0090367.26-'即负处于数结束标志? –

+0

解决此问题的最佳方法是停止将数字存储为字符。然后你只需要一点格式。 –

+0

@JaydipJ。是0090367.26-是一个负数 – Anj

回答

0

您可以使用REPLACE()TRIM()CASE EXPRESSION

SELECT CASE WHEN LastAnalysisAmount LIKE '%-' 
      THEN '-' + REPLACE(LTRIM(LastAnalysisAmount),'-','') 
      ELSE LTRIM(LastAnalysisAmount) 
     END as LastAnalysisAmount 
FROM YourTable 

加载它为十进制到目标表:

INSERT INTO Destination_Table (LastAnalysisAmount) 
SELECT CAST(CASE WHEN LastAnalysisAmount LIKE '%-' 
       THEN '-' + REPLACE(LTRIM(LastAnalysisAmount),'-','') 
       ELSE LTRIM(LastAnalysisAmount) 
      END AS decimal(10,2)) 
FROM YourTable 
+0

感谢您的回答 – Anj

0

您可以用case sttaement做到这一点使用varchar()

select (case when LastAnalysisAmount like '%-' 
      then '-' + replace(LastAnalysisAmount, '-', '') 
      else LastAnalysisAmount 
     end) as LastAnalysisAmount 

如果要发送数据为小数,你可以施放此为适当的类型。

+0

不应该有一个前导0的修剪(通过字符串操作或铸造)?因为OP希望没有他们的结果。 –

+0

@Gordon Linoff谢谢你的回答 – Anj

1

你可以这样做对目标表装入

INSERT INTO dest_table (LastAnalysisAmount) 
SELECT CAST(CASE WHEN RIGHT(LastAnalysisAmount,1) = '-' 
       THEN '-' + REPLACE(LTRIM(LastAnalysisAmount),'-','') 
       ELSE LTRIM(LastAnalysisAmount) 
      END AS decimal(10,2)) 
FROM from_table 
1

试试这个:这将处理负值的情况下,将其转换为DECIMAL(8,2)

SELECT CAST(
     CASE WHEN CHARINDEX('-',LastAnalysisAmount) > 0 
      THEN STUFF(LEFT(LastAnalysisAmount,LEN(LastAnalysisAmount)-1),1,0,'-') 
      ELSE LastAnalysisAmount 
      END AS DECIMAL(8,2) 
     ) AS LastAnalysisAmount 
+0

plus1对不起,它只是完美的... – Sankar

+0

那么这意味着值被转换为'LastAnalysisAmount'。对? – Sankar

+0

那么它意味着将值转换为LastAnalysisAmount。对? **对,就是这样** –