【问题标题】:Add a . every 3rd digit/pad with 0 in SELECT添加一个 . SELECT 中每第三个数字/填充 0
【发布时间】:2012-09-24 07:28:52
【问题描述】:

在一个 MS Access 2007 项目中,我有一个包含以下记录源的报告:

SELECT SomeTable.SomeCol FROM SomeTable;

SomeCol应该为 1、2、3、6 或 9 位数字。

让我们先来看看 3、6 和 9。说它是123 - 这应该保持为123。如果是123456,则应改为123.456。如果是123456789,则应更改为123.456.789。如果是1,或65,则应分别改为001和065。

如何修改我的SELECT 以执行这些更改?如果长度不是 1、2、3、6 或 9,则字符串应保持不变。

谢谢!

【问题讨论】:

  • 你的SomeCol是什么数据类型
  • @RowlandShaw 这是文本 - 我知道,我知道。它应该是一个数字。不幸的是,这是我无法控制的。

标签: sql ms-access ms-access-2007


【解决方案1】:

我找到了一个解决方案,虽然不是很漂亮。

实际上,SomeTable.SomeCol 是一个很长的字符串,所以在我的系统上看起来更糟。 SELECT 是更大查询的一部分,有多个JOIN,因此需要SomeTable。我觉得这是最好的解决方案:

SELECT switch(
    len(SomeTable.SomeCol) < 3,
        format(SomeTable.SomeCol, '000'),
    len(SomeTable.SomeCol) = 6,
        format(SomeTable.SomeCol, '000\.000'),
    len(SomeTable.SomeCol) = 9,
        format(SomeTable.SomeCol, '000\.000\.000'),
    true,
        SomeTable.SomeCol
) as SomeCol
FROM SomeTable;

【讨论】:

  • @HansUp 这个只在单个报表中使用,所以我认为在SQL中这样做是可以的。
【解决方案2】:

我不知道你的语言环境,所以我不知道数字是默认为停顿还是逗号:

SELECT IIf(Len([atext])<4,Format([atext],"000"),Replace(Format(Val([atext]),"#,###"),",",".")) AS FmtNumber
FROM Table2 AS t;

您可以使用类似的格式语句,而不需要将您的报告基于查询,但请确保在将其设置为函数之前更改控件的名称。

【讨论】:

  • 这很有帮助。我没有使用这个确切的 SQL,但使用 format() 启发了一个更好的方法来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多