如何在 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;
我遇到了以下解决方案,但它不适用于 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;