1

我需要一些关于 sql 转换的帮助。我收到的这部分查询:

'$' + replace(cast((CAST(p.Price1 AS decimal(10,2)) * cast(isnull(p.Multiplier,1) as decimal(10,2))) as varchar), '.0000', '')

基本上,它最终是一个看起来像这样的 varchar:$26980

我需要在千和百万标记处插入一个逗号(如果适用)。所以在这种情况下,$26,980

无需重写整个内容的最简单方法是什么?

4

3 回答 3

1

如果你真的必须在 TSQL 中做,你可以使用CONVERT(),但是这种东西真的不属于数据库:

declare @m money = 12345678
-- with decimal places
select '$' + convert(varchar, @m, 1)
-- without decimal places
select '$' + replace(convert(varchar, @m, 1), '.00', '')
于 2012-11-15T22:24:05.320 回答
1

在客户端执行此操作。话虽如此,这个例子应该告诉你方法。

with p(price1, multiplier) as (select 1234.5, 10)
select '$' + replace(cast((CAST(p.Price1 AS decimal(10,2)) * cast(isnull(p.Multiplier,1) as decimal(10,2))) as varchar), '.0000', ''),
       '$' + parsename(convert(varchar,cast(p.price1*isnull(p.Multiplier,1) as money),1),2)
from p

关键在最后一个表达式

'$' + parsename(convert(varchar,cast(p.price1*isnull(p.Multiplier,1) as money),1),2)

注意:如果p.price1它的精度高于小数(10,2),那么您可能还必须在表达式中强制转换它以产生忠实的翻译,因为原始CAST(p.Priced1 as decimal(10,2))将执行舍入。

于 2012-11-16T00:40:17.657 回答
0

你可以把它变成一个函数,它只返回 50 个字符。

DECLARE @input VARCHAR(50)
SELECT @input = '123123123.00'
SELECT @input = CASE WHEN CHARINDEX('.', @input) > offset +1
                      THEN STUFF(@input, CHARINDEX('.', @input) - offset, 0, ',') 
                      ELSE @input END
FROM (SELECT 3 offset UNION SELECT 7 UNION SELECT 12 UNION SELECT 18 UNION SELECT 25 UNION SELECT 33 UNION SELECT 42) b
PRINT @input

每个位置的偏移量增加 +1,因为它假设您已经为之前的位置插入了逗号。

于 2012-11-15T22:31:59.580 回答