SQL Server 中的 Oracle TO_CHAR 格式模块“FM099999999V99MI”等效项

Posted

技术标签:

【中文标题】SQL Server 中的 Oracle TO_CHAR 格式模块“FM099999999V99MI”等效项【英文标题】:Oracle TO_CHAR Format Module 'FM099999999V99MI' equivalent in SQL Server 【发布时间】:2021-11-11 13:53:36 【问题描述】:

我正在将数据从 Oracle 移动到 MS SQL 服务器。我正在为金额字段使用TO_CHAR 格式模块,以使用 FM 将金额更改为所需的格式。我正在 SQL 服务器中寻找一个等效的函数来获得相同的输出。

甲骨文:

Select Amount, TO_CHAR(Amount, 'FM099999999V99MI') as Converted from Billing_table

输出:

Amount Converted
0 00000000000
1985.56 00000198556
18.63 00000001863 ​
-258.93 00000025893- ​
-6.02 00000000602- ​

【问题讨论】:

你想要右边的负号吗?一定是特定行业的东西,即使你向我解释,我也永远不会理解(所以不要打扰),但至少可以说这很奇怪。 是的,我和你在同一条船上!这就是供应商的要求:) 【参考方案1】:

SQL Server 确实有format(),但请注意。由于性能问题,应该谨慎使用

示例

Declare @YourTable table (Amount*100 decimal(15,2))
Insert Into @YourTable values
 (0)
,(1985.56)
,(18.63)
,(-258.93)
,(-6.02)


Select Amount 
      ,Converted =  format(Amount*100,'00000000000;00000000000-')
 From  @YourTable

结果

Amount  Converted
0.00    00000000000
1985.56 00000198556
18.63   00000001863
-258.93 00000025893-
-6.02   00000000602-

【讨论】:

【参考方案2】:

可能有 100 种不同的方法可以做到这一点。 FORMAT() 绝对看起来更干净、更直观,但我和 John 一样远离它 due to performance overhead。

CREATE TABLE dbo.nums(val decimal(15,2));

INSERT dbo.nums(val) VALUES(0),
(1985.56),
(18.63),
(-258.93),
(-6.02);

SELECT val, RIGHT(REPLICATE('0',11) 
    + RTRIM(CONVERT(int,100*ABS(val))),11) 
    + CASE WHEN val < 0 THEN '-' ELSE '' END
  FROM dbo.nums;

结果:

val (No column name)
0.00 00000000000
1985.56 00000198556
18.63 00000001863
-258.93 00000025893-
-6.02 00000000602-
示例db<>fiddle

【讨论】:

完全披露:我会不时使用 format(),但仅限于小型集。有些人认为 format() 是邪恶的,而我认为它只是另一种选择……另一个工具。无论哪种方式 +1 以获得更高性能的选项。 @John 是的,我认为 format() 在紧要关头很方便,但就像你说的那样,它可以成为一个杀手,而且你通常最好在表示层,如果它甚至是中等复杂的话。我是一个非常“不要使用异常,即使你完全理解为什么在这种情况下异常是可以的以及在其他情况下使用它的危险” - 如果异常需要免责声明和它自己的文档...... :-) 感谢 John Cappelletti,它按预期工作,感谢您的快速响应。谢谢大家【参考方案3】:

根据this answer 和custom format string 你可以使用:

with a as (
  select *
  from(values (0), (1985.56), (18.63), (-258.93), (-6.0234), (-10)) as t(val)
)
select
  val,
  /*Set explicit format with fixed decimal points*/
  replace(format(val, '000000000.00;000000000.00-'), '.', '') as formatted,
  /*Explicit multiplication*/
  format(val*100, '00000000000;00000000000-') as formatted2
from a
GO
值 |格式化 |格式化2 --------: | :----------- | :----------- 0.0000 | 00000000000 | 00000000000 1985.5600 | 00000198556 | 00000198556 18.6300 | 00000001863 | 00000001863 -258.9300 | 00000025893- | 00000025893- -6.0234 | 00000000602- | 00000000602- -10.0000 | 00000001000- | 00000001000-

db小提琴here

【讨论】:

以上是关于SQL Server 中的 Oracle TO_CHAR 格式模块“FM099999999V99MI”等效项的主要内容,如果未能解决你的问题,请参考以下文章

从oracle表中选择sql server表中的列

Oracle 在 SQL Server 中的位图索引

SQL Server 中怎样访问Oracle中的数据

Oracle 和 SQL Server 中的 NVARCHAR 之间的区别?

SQL Server 开始传输.. Oracle 中的回滚等价物

怎么把sqlserver一个表中的数据导入到oracle中???