Sql 如何将数字转换为以逗号分隔的数字格式字符串?

Sql 如何将数字转换为以逗号分隔的数字格式字符串?,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,有没有一种简单的方法可以将数字(在我的例子中是整数)转换为逗号分隔的nvarchar字符串 例如,如果字段中存储了int值1000000,如何将其转换为输出结果为“1000000”的nvarchar字符串 我可以很容易地编写一个函数来实现这一点,但我想确保没有更简单的方法来调用CAST或CONVERT不确定它是否在tsql中工作,但是有to_char(): 正如示例所示,格式的长度需要与数字的长度匹配才能获得最佳结果,因此如果需要,您可能希望将其包装在函数中(例如number_format())

有没有一种简单的方法可以将数字(在我的例子中是整数)转换为逗号分隔的
nvarchar
字符串

例如,如果字段中存储了
int
1000000
,如何将其转换为输出结果为“1000000”的
nvarchar
字符串


我可以很容易地编写一个函数来实现这一点,但我想确保没有更简单的方法来调用
CAST
CONVERT

不确定它是否在tsql中工作,但是有
to_char()

正如示例所示,格式的长度需要与数字的长度匹配才能获得最佳结果,因此如果需要,您可能希望将其包装在函数中(例如number_format())


正如其他回复者所指出的那样,转换成货币也是可行的

test=# select substring(cast(cast(131213211653.78 as money) as varchar) from 2);
     substring      
--------------------
 131,213,211,653.78

整型到nnn、nnn的快速脏化(&D)

declare @i int = 123456789
select replace(convert(varchar(128), cast(@i as money), 1), '.00', '')
>> 123,456,789

对于如何在t-SQL中实现这一点,您找不到简单的示例的原因是,在SQL代码中实现格式化逻辑通常被认为是不好的做法。RDBMS并不是为演示而设计的。虽然可以进行一些有限的格式化,但让应用程序或用户界面处理这种类型的格式化几乎总是更好的

但如果您必须(有时我们也必须!)使用T-SQL,请将int转换为money并将其转换为varchar,如下所示:

select convert(varchar,cast(1234567 as money),1)
如果不需要尾随的小数,请执行以下操作:

select replace(convert(varchar,cast(1234567 as money),1), '.00','')

祝你好运

您真的不应该在SQL中这样做-您应该在中间件中格式化它。但我认识到,有时有一个边缘的情况,需要一个人做这样的事情

这看起来可能有你的答案:


用替换和转换删除逗号:

CONVERT(INT,REPLACE([varName],',',''))
其中varName是在SQL Server 2012或更高版本中包含带有逗号的数值的变量的名称,更容易使用。
例如:


结果是:
1234568

我查看了几个选项。以下是我的两个最爱,因为我需要对值进行四舍五入

,DataSizeKB = replace(convert(varchar,Cast(Round(SUM(BigNbr / 0.128),0)as money),1), '.00','')
,DataSizeKB2   = format(Round(SUM(BigNbr / 0.128),0),'##,##0')
-----------------
--- below if the full script where I left DataSizeKB in both methods -----------
--- enjoy --------- 
--- Hank Freeman : hfreeman@msn.com 
-----------------------------------
--- Scritp to get rowcounts and Memory size of index and Primary Keys
   SELECT
   FileGroupName = DS.name
   ,FileGroupType =
      CASE DS.[type]
        WHEN 'FG' THEN 'Filegroup'
        WHEN 'FD' THEN 'Filestream'
        WHEN 'FX' THEN 'Memory-optimized'
        WHEN 'PS' THEN 'Partition Scheme'
        ELSE 'Unknown'
      END
   ,SchemaName = SCH.name
   ,TableName = OBJ.name
   ,IndexType =
      CASE IDX.[type]
        WHEN 0 THEN 'Heap'
        WHEN 1 THEN 'Clustered'
        WHEN 2 THEN 'Nonclustered'
        WHEN 3 THEN 'XML'
        WHEN 4 THEN 'Spatial'
        WHEN 5 THEN 'Clustered columnstore'
        WHEN 6 THEN 'Nonclustered columnstore'
        WHEN 7 THEN 'Nonclustered hash'
      END
   ,IndexName = IDX.name
   ,RowCounts = replace(convert(varchar,Cast(p.rows as money),1), '.00','')  --- MUST show for all types when no Primary key
   --,( Case WHEN IDX.[type] IN (2,6,7) then 0  else  p.rows  end )as Rowcounts_T
   ,AllocationDesc = AU.type_desc
/*
   ,RowCounts = p.rows  --- MUST show for all types when no Primary key
   ,TotalSizeKB2  = Cast(Round(SUM(AU.total_pages / 0.128),0)as int) -- 128 pages per megabyte
   ,UsedSizeKB    = Cast(Round(SUM(AU.used_pages / 0.128),0)as int) 
   ,DataSizeKB    = Cast(Round(SUM(AU.data_pages / 0.128),0)as int)
    --replace(convert(varchar,cast(1234567 as money),1), '.00','')
*/
   ,TotalSizeKB   = replace(convert(varchar,Cast(Round(SUM(AU.total_pages / 0.128),0)as money),1), '.00','') -- 128 pages per megabyte
   ,UsedSizeKB    = replace(convert(varchar,Cast(Round(SUM(AU.used_pages / 0.128),0)as money),1), '.00','') 
   ,DataSizeKB    = replace(convert(varchar,Cast(Round(SUM(AU.data_pages / 0.128),0)as money),1), '.00','')
   ,DataSizeKB2   = format(Round(SUM(AU.data_pages / 0.128),0),'##,##0')
   ,DataSizeKB3   = format(SUM(AU.data_pages / 0.128),'##,##0')
   --SELECT Format(1234567.8, '##,##0.00')
   ---
   ,is_default    = CONVERT(INT,DS.is_default)
   ,is_read_only = CONVERT(INT,DS.is_read_only)
  FROM
   sys.filegroups DS -- you could also use sys.data_spaces
    LEFT JOIN sys.allocation_units AU ON DS.data_space_id = AU.data_space_id
    LEFT JOIN sys.partitions PA
      ON (AU.[type] IN (1,3) AND
          AU.container_id = PA.hobt_id) OR
         (AU.[type] = 2 AND
          AU.container_id = PA.[partition_id])
    LEFT JOIN sys.objects OBJ ON PA.[object_id] = OBJ.[object_id]
    LEFT JOIN sys.schemas SCH ON OBJ.[schema_id] = SCH.[schema_id]
    LEFT JOIN sys.indexes IDX
      ON PA.[object_id] = IDX.[object_id] AND
         PA.index_id = IDX.index_id
    -----
    INNER JOIN 
      sys.partitions p ON obj.object_id = p.OBJECT_ID AND IDX.index_id = p.index_id
  WHERE
    OBJ.type_desc = 'USER_TABLE' -- only include user tables
    OR
    DS.[type] = 'FD' -- or the filestream filegroup
  GROUP BY
    DS.name ,SCH.name ,OBJ.name ,IDX.[type] ,IDX.name ,DS.[type]  ,DS.is_default   ,DS.is_read_only -- discard different allocation units
   ,p.rows  ,AU.type_desc  --- 
  ORDER BY
    DS.name ,SCH.name ,OBJ.name ,IDX.name
   ---
   ;

尽管格式化属于表示层,但SQL Server 2012及更高版本提供了FORMAT()函数,该函数提供了格式化输出的最快速、最简单的方法之一。以下是一些提示和示例:

语法
格式(值、格式[、区域性])

返回:Format函数返回使用指定格式和可选区域性格式化的NVarchar字符串。(对于无效的格式字符串,返回NULL。)

注意:Format()函数在CLR/all.NET语言中是一致的,并提供了生成格式化输出的最大灵活性

以下是使用此功能可以实现的几种格式类型:

  • 数字/货币格式-“C”表示货币,“N”表示不带货币符号的数字,“x”表示六位小数

  • 日期/时间格式-'d'短日期,'d'长日期,'f'短完整日期/时间,'f'长完整日期/时间,'t'短时间,'t'长时间,'m'月+日,'y'年+月

  • 自定义格式-您可以使用某些符号/字符,例如dd、mm、yyyy等(用于日期),形成自己的自定义格式。散列(#)货币符号(£$等)、逗号(,)等。见下面的例子

示例

   select FORMAT(GETDATE(), 'ddd  dd/MM/yyyy')  --> Tue 20/06/2017
   select FORMAT(GETDATE(), 'dddd dd-MMM-yyyy') --> Tuesday 20-Jun-2017
   select FORMAT(GETDATE(), 'dd.MMMM.yyyy HH:mm:ss') --> 20.June.2017 22:47:20
   select FORMAT(123456789.75,'$#,#.00')  --> $123,456,789.75
   select FORMAT(123456789.75,'£#,#.0')   --> £123,456,789.8
内置数字/货币格式的示例:

   select FORMAT(1500350.75, 'c', 'en-gb') --> £1,500,350.75
   select FORMAT(1500350.75, 'c', 'en-au') --> $1,500,350.75
   select FORMAT(1500350.75, 'c', 'en-in') --> ₹ 15,00,350.75
   select FORMAT(getdate(), 'd', 'en-gb') --> 20/06/2017
   select FORMAT(getdate(), 'D', 'fr-fr') --> mardi 20 juin 2017
   select FORMAT(getdate(), 'F', 'en-us') --> Tuesday, June 20, 2017 10:41:39 PM
   select FORMAT(getdate(), 'T', 'en-gb') --> 22:42:29
内置日期格式的示例:

   select FORMAT(1500350.75, 'c', 'en-gb') --> £1,500,350.75
   select FORMAT(1500350.75, 'c', 'en-au') --> $1,500,350.75
   select FORMAT(1500350.75, 'c', 'en-in') --> ₹ 15,00,350.75
   select FORMAT(getdate(), 'd', 'en-gb') --> 20/06/2017
   select FORMAT(getdate(), 'D', 'fr-fr') --> mardi 20 juin 2017
   select FORMAT(getdate(), 'F', 'en-us') --> Tuesday, June 20, 2017 10:41:39 PM
   select FORMAT(getdate(), 'T', 'en-gb') --> 22:42:29
自定义格式的示例

   select FORMAT(GETDATE(), 'ddd  dd/MM/yyyy')  --> Tue 20/06/2017
   select FORMAT(GETDATE(), 'dddd dd-MMM-yyyy') --> Tuesday 20-Jun-2017
   select FORMAT(GETDATE(), 'dd.MMMM.yyyy HH:mm:ss') --> 20.June.2017 22:47:20
   select FORMAT(123456789.75,'$#,#.00')  --> $123,456,789.75
   select FORMAT(123456789.75,'£#,#.0')   --> £123,456,789.8
有关FORMAT()函数的详细信息,请参阅

对于SQL Server 2008或以下版本首先将输出转换为货币,然后再转换为VARCHAR(输出格式的“1”传递),例如:


你想从
1000000
转到
1000000
吗?可能是重复的,第二个语句就是我要找的。在这个语句中,我必须生成一个表,其中包含一个特定列,该列的数据位于固定位置。其中一些数据是数字的,主要用户(嗯,我的老板)希望数据格式化。是的,我可以在我的C#应用程序中迭代表,但是,当来自SQL的数据仅用于显示时,我更喜欢将表数据操作保持在最低限度。也许这被认为是“不好的做法”,但我更喜欢保留我的“数据”库作为“数据”的主要来源。@RLH格式是一个演示问题。添加尾随的零和逗号不是数据的一部分,但在表示层中显示时,添加尾随的零和逗号肯定会使其更人性化。这与我最初寻找的答案相反。我有一个数字,我想把它转换成一个字符串,用逗号格式化。这应该是一个注释,或者根本不包括在内,以便将其标记为重复项。这是当前MS-SQL版本的最佳答案。我将此重新指定为新答案,因为它更适合今天的SQL Server变体。或者干脆
选择格式(1234567.8,,#,0')
Awesome…格式(123456789,,#,#')也能让你达到目的(不需要四舍五入)