我知道它可以在非SQL环境中轻松完成[后期数据处理,前端,你有什么],但目前还不可能。有没有办法取decimal(5,2)
并将其转换为varchar
而没有尾随零/小数点?例如:
declare @number decimal(5,2)
set @number = 123.00
select cast(@number as varchar) as FormattedNumber
结果是'123.00'。是否有(简单)方法来获得'123'?同样,而不是'123.30','123.3'?可以通过弄清楚百分之十/十分位数是否为0并手动修剪字符来做到这一点,但我想知道是否有更优雅的解决方案。
答案 0 :(得分:14)
怎么样:
SELECT CAST(CAST(@number AS float) AS varchar(10))
但是,您可能需要先仔细测试原始数据。
答案 1 :(得分:4)
这种方式非常简单:
DECLARE @Number DECIMAL(5,2)
SELECT @Number = 123.65
SELECT FormattedNumber = CAST(CAST(@Number AS DECIMAL(3,0)) AS VARCHAR(4))
返回'124'。
唯一要考虑的是你是想要向上/向下舍入,还是只删除零和小数点而不进行舍入;你会在第二种情况下将DECIMAL强制转换为INT。
答案 2 :(得分:3)
对于T-SQL中数字的受控格式,您应该使用FORMAT()
函数。例如:
DECLARE @number DECIMAL(9,2); SET @number = 1234567.12;
DECLARE @formatted VARCHAR(MAX); SET @formatted = FORMAT(@number, 'N0', 'en-AU');
PRINT @formatted;
结果将是:
1,234,567
FORMAT()
函数的参数是:
FORMAT(value, format [, culture])
value参数是您的号码。 format参数是一个CLR类型的格式化字符串(在本例中,我指定了“正常数,零精度”)。可选的culture参数允许您覆盖服务器区域设置,以根据所需的区域设置格式化数字。
答案 3 :(得分:0)
转换功能可以做你想做的事。
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/a87d0850-c670-4720-9ad5-6f5a22343ea8.htm
答案 4 :(得分:0)
让我再试一次......
CREATE FUNCTION saneDecimal(@input decimal(5,2)) returns varchar(10)
AS
BEGIN
DECLARE @output varchar(10)
SET @output = CAST(@input AS varchar(10))
DECLARE @trimmable table (trimval char(1))
INSERT @trimmable VALUES ('0')
INSERT @trimmable VALUES ('.')
WHILE EXISTS (SELECT * FROM @trimmable WHERE trimval = CAST(SUBSTRING(@output, LEN(@output), 1) AS char(1)))
SET @output = LEFT(@output, LEN(@output) - 1)
RETURN @output
END
GO
SELECT dbo.saneDecimal(1.00)
答案 5 :(得分:0)
您可以在while循环中删除尾随零:
declare @number decimal(5,2)
declare @str varchar(100)
set @number = 123.00
set @str = @number
while substring(@str,len(@str),1) in ('0','.',',')
set @str = substring(@str,1,len(@str)-1)
但正如AdaTheDev评论的那样,客户端更容易做到这一点。
答案 6 :(得分:0)
简单而优雅?不是那么多......但那是你的T-SQL:
DECLARE @number decimal(5,2) = 123.00
DECLARE @formatted varchar(5) = CAST(@number as varchar)
SELECT
LEFT(
@formatted,
LEN(@formatted)
- PATINDEX('%[^0.]%', REVERSE(@formatted))
+ 1
)
答案 7 :(得分:0)
使用SQL Server 2012 +中的格式(值,格式字符串,区域性)功能
答案 8 :(得分:0)
如果您有SQL Server 2012或更高版本,则可以使用以下格式函数:
select format(@number,'0') as FormattedNumber
格式函数当然会返回一个nvarchar,而不是一个varchar。您可以强制转换以获取特定类型。
答案 9 :(得分:-2)
另外,看看联机丛书中的T-SQL STR功能;这可以用于格式化浮动,可能适用于您的情况。出于某种原因,它不会出现与此问题有关的Google搜索。