如何在 Sybase SQLAnywhere 上用逗号格式化 sql 数字类型?

How do i format a sql numeric type with commas on Sybase SQLAnywhere?

我遇到了以下解决方案,但它不适用于 Sybase

SELECT CONVERT(varchar, CAST(987654321 AS money), 1)

我已经阅读了 Convert Sybase 信息,但我仍然收到没有逗号的相同号码。

您是否尝试过使用 varchar (20) 作为示例?像 :

SELECT CONVERT(varchar(20), CAST(987654321 AS money), 1)

在 SqlAnywhere 中,money 数据类型是一个域,实现为 NUMERIC(19,4)。

在CAST函数中,如果不指定字符串类型的长度,数据库服务器会选择一个合适的长度。如果没有为 DECIMAL 转换指定精度和小数位数,数据库服务器会选择适当的值。

也许这就是导致问题的原因,您得到了什么输出?你得到 987654321.00 还是 987654321

更新:

我最后的建议是使用 insertstr() 函数并循环遍历您号码的字符值以每 3 位数字插入逗号..这不是 cleanest/easiest 方式,但显然 SQLAnywhere 处理金钱数据类型为正常的 NUMERIC 数据类型 ...

insertstr() 文档是 here

我会给你一个代码示例,但我没有安装 SQLAnywhere 来测试它...

您需要区分服务器端格式和客户端格式。例如,当您使用 'isql' 客户端(TDS 客户端)时,结果将是这样的:

1> select convert(money, 9876543210)
2> go
 9876543210
 ------------------------
         9,876,543,210.00

(1 row affected)

但这纯粹是因为客户端应用程序恰好以这种方式格式化 'money' 值。此外,这实际上不是特定于 SQLA,因为 isql 最初是 ASE(不同的 Sybase 数据库)的客户端工具。

当您 运行 在 SQLA 服务器上进行相同的转换时(即作为 SQL 语句中表达式的一部分),这些逗号将不存在,因为 SQLA 没有这样的内置格式样式。 如果你想要这个,你应该写一个 SQL 函数来格式化你想要的数字。

Here is the SP i created based on F Karam suggestion.
CREATE FUNCTION "DBA"."formattednumber"( in @number numeric) 
returns char(60)
begin
  declare @returnnumber char(60);
  declare @workingnumber char(60);
  declare @n_ind char(1);
  declare @decimalnumber char(10);
  declare @tempnumber char(60);
  declare @decimalpos integer;
  if isnull(@number,'') = '' then
    return null
  end if;
  if @number < 0 then set @n_ind = 'Y'
  else set @n_ind = 'N'
  end if;
  set @workingnumber = convert(char(60),ABS(@number));
  set @decimalpos = patindex('%.%',@workingnumber);
  if @decimalpos > 0 then
      set @decimalnumber = substr(@workingnumber,@decimalpos);
      set @decimalnumber = "left"(@decimalnumber,3+1);
      set @workingnumber = "left"(@workingnumber,@decimalpos-1)
    end if end if;
  set @returnnumber = '';

  while length(@workingnumber) > 3 loop

    set @tempnumber = "right"(@workingnumber,3);
    set @returnnumber = insertstr(0,@returnnumber,@tempnumber);
    set @workingnumber = "left"(@workingnumber,length(@workingnumber)-3);
    if length(@workingnumber) > 0 then
      set @returnnumber = insertstr(0,@returnnumber,',')
    end if
  end loop; 
  if length(@workingnumber) > 0 then
    set @returnnumber = insertstr(0,@returnnumber,@workingnumber)
  end if;

  if length(@decimalnumber) > 0 then
    set @returnnumber = @returnnumber+@decimalnumber
  end if;

  if @n_ind = 'Y' then set @returnnumber = '-' || @returnnumber
  end if;
  return(@returnnumber)
end;