我一直在尝试从表的列中删除结尾的零。当我使用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
有人可以帮我吗?
答案 0 :(得分:1)
根据data type precedence rules,CASE
表达式将始终返回相同数据类型的值。对于您的情况,考虑到一个分支返回一个varchar
,而另一个分支返回一个decimal
,则结果将始终是decimal
。
要获得所需的结果,请更改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
答案 1 :(得分: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