0

我一直在尝试从表的列中删除尾随零。当我使用 case 语句(在打开标志时删除零,并在关闭标志时保留它们)时,它无法正常工作。它不认识国旗。@Tim Biegeleisen 帮助我解释了正在发生的隐式转换。

我想互换地删除或保留零。例如,当标志打开时,我希望 0.091000 为 0.091;当标志关闭时,我希望它是相同的 0.091000。例如,这可以正常检索删除零并分别保留零。

CREATE TABLE #tablea 
(item CHAR(2), name VARCHAR(10), amount DECIMAL(9,2)) 

INSERT INTO #tablea 
VALUES ('AB', 'D1', 1.10), 
       ('AB', 'D2', 1.00), 
       ('AB', 'D3', 0.90), 
       ('AB', 'D4', 0.09)    

SELECT  CAST(CAST(amount AS DECIMAL(6,2)) AS VARCHAR(max)), cast(CAST(amount 
AS decimal(6,2)) as float)  
FROM #tablea 

它显示两列:一列带零,一列不带零。

但是,它根本不会删除表中的零。它根本不认识国旗。这是一个例子:

DECLARE @flag INT = 1

SELECT CASE WHEN @flag = 1 
THEN CAST(CAST(amount AS DECIMAL(6,2)) AS VARCHAR(max))
ELSE amount END 
FROM #tablea 

谁能帮我这个?

4

2 回答 2

1

根据数据类型优先规则CASE,表达式将始终返回相同数据类型的值。在您的情况下,考虑到一个分支返回 a而另一个分支返回 a ,结果将始终是 a 。varchardecimaldecimal

要获得所需的结果,请更改CASE表达式以在两个分支中返回相同的数据类型:

DECLARE @flag INT = 1

SELECT CASE WHEN @flag = 1 
THEN CAST(CAST(amount AS DECIMAL(6,2)) AS VARCHAR(100))
ELSE CAST(CAST(amount AS FLOAT) AS VARCHAR(100)) END 
FROM #tablea 
于 2019-06-17T17:17:21.847 回答
0

你可以这样做...

    CREATE TABLE #tablea (item CHAR(2), name VARCHAR(10), amount decimal(18,6), flag int) 

    INSERT INTO #tablea 
    VALUES ('AB', 'D1', 1.10, 1), 
           ('AB', 'D2', 1.00, 0), 
           ('AB', 'D3', 0.90, 1), 
           ('AB', 'D4', 0.09, 0)    

    SELECT case when  flag = 1 then FORMAT(amount, 'n2') else FORMAT(amount, 'n4')  end amt FROM #tablea 
于 2019-06-17T17:49:36.457 回答