如何使用 FORMAT() 将条件格式应用于 SQL Server 中的数字

发布于

也许 SQL Server 中 FORMAT() 函数的一个鲜为人知的功能是使您能够将条件格式应用于数字的功能。

它更像是一个.NET功能,而不是SQL Server(或T-SQL)功能,但SQL Server/T-SQL同样支持它,允许你充分利用将条件格式应用于数字的功能。

这一切都归结为您传递给函数的格式字符串。FORMAT()

可以传递一个格式字符串,该字符串指定应如何设置数字的格式,具体取决于它是正数、负数还是零。

需要明确的是,我不是在谈论用颜色或字体等格式化数字。我只是在谈论您通常使用该函数的数字格式(例如添加千位分隔符、百分号、小数点等)。FORMAT()

此外,这种条件格式非常有限——只能测试三个条件(正、负或零)。但是,如果需要,您也可以一次将相同的格式应用于两个条件。

无论如何,下面介绍如何使用该函数将条件格式应用于 SQL Server 中的数字。FORMAT()

简介 – 节分隔符;

.NET 将分号 () 定义为其自定义数字格式说明符之一,称为节分隔符。;

节分隔符是一个条件格式说明符,它使用正数、负数和零数的单独格式字符串定义节。这允许您根据数字的值是正数、负数还是零对数字应用不同的格式。

自定义数字格式字符串最多可以包含三个部分,以分号分隔。具体如下:

  • 一节:在这种情况下,没有条件格式适用。格式字符串适用于所有值。不需要节分隔符(因为只有一个节)。毫无疑问,这是格式字符串最常见的形式。

  • 两部分:第一部分适用于正值和零,第二部分适用于负值。

    如果要格式化的数字为负数,但在根据第二部分中的格式舍入后变为零,则生成的零将根据第一部分进行格式化。

  • 三个部分:第一部分适用于正值,第二部分适用于负值,第三部分适用于零。

    第二部分可以留空(分号之间没有任何内容),在这种情况下,第一部分适用于所有非零值。

    如果要格式化的数字为非零,但在根据第一部分或第二部分中的格式舍入后变为零,则生成的零将根据第三部分进行格式化。

请注意,使用节分隔符时,负值始终不带减号(尽管也有例外,稍后您将看到)。如果希望最终格式化值具有减号,则需要显式包含减号作为自定义格式字符串的一部分。这也适用于与数字关联的任何其他预先存在的格式。

示例 1 – 一个部分(无条件格式)

下面是一个由一个部分组成的典型数字格式字符串。不使用节分隔符,因此不应用条件格式。

法典:

SELECT FORMAT(123, ‘0 (Number)’) Positive, FORMAT(-123, ‘0 (Number)’) Negative, FORMAT(0, ‘0 (Number)’) Zero;

输出:

+--------------+---------------+------------+
| Positive     | Negative      | Zero       |
|--------------+---------------+------------|
| 123 (Number) | -123 (Number) | 0 (Number) |
+--------------+---------------+------------+

请注意,减号保持不变。如果我们使用节分隔符,这将被删除。

示例 2 – 两个部分(条件格式)

这是条件格式开始的地方。

在此示例中,我们有两个部分(由一个部分分隔符分隔)。分隔符左侧的部分仅适用于正值或零值。右侧部分仅适用于负值。

法典:

SELECT FORMAT(123, ‘0 (Positive or Zero); 0 (Negative)’) Result;

输出:

+------------------------+
| Result                 |
|------------------------|
| 123 (Positive or Zero) |
+------------------------+

在这个示例中,数字是正数,因此使用第一部分来格式化它。

示例 3 – 两个部分(相同格式字符串,不同值)

在下一个示例中,相同的格式字符串应用于不同的值(正、负和零)。

法典:

SELECT FORMAT(123, ‘0 (Positive or Zero); 0 (Negative)’) Positive, FORMAT(-123, ‘0 (Positive or Zero); 0 (Negative)’) Negative, FORMAT(0, ‘0 (Positive or Zero); 0 (Negative)’) Zero;

输出:

+------------------------+-----------------+----------------------+
| Positive               | Negative        | Zero                 |
|------------------------+-----------------+----------------------|
| 123 (Positive or Zero) |  123 (Negative) | 0 (Positive or Zero) |
+------------------------+-----------------+----------------------+

因此,此示例演示了节分隔符的真正好处 - 我们可以根据值获得不同的结果。

示例 4 – 两个四舍五入的部分

使用两个部分时,舍入为零的任何负值都将在第一个格式字符串下格式化。

法典:

SELECT FORMAT(0.1, ‘0 (Positive or Zero); 0 (Negative)’) Positive, FORMAT(-0.1, ‘0 (Positive or Zero); 0 (Negative)’) Negative;

输出:

+----------------------+----------------------+
| Positive             | Negative             |
|----------------------+----------------------|
| 0 (Positive or Zero) | 0 (Positive or Zero) |
+----------------------+----------------------+

示例 5 – 三个部分(基本用法)

下面是指定三个部分的基本示例。我们使用两个节分隔符来实现这一点。

法典:

SELECT FORMAT(123, ‘0 (Positive); 0 (Negative); 0 (Zero)’) Result;

输出:

+----------------+
| Result         |
|----------------|
| 123 (Positive) |
+----------------+

在本例中,该数字为正值,因此将其格式化为第一部分。

示例 6 – 三个部分(相同的格式字符串,不同的值)

此示例演示了我们可以从上一个示例中获得的各种结果,具体取决于输入值。

在这里,相同的格式字符串应用于不同的值。我还将格式字符串分配给变量,但这只是为了使其更易于阅读。

DECLARE @formatstring varchar(35); SET @formatstring = ‘0 (Positive); 0 (Negative); 0 (Zero)’; SELECT FORMAT(123, @formatstring) ‘Positive’, FORMAT(-123, @formatstring) ‘Negative’, FORMAT(0, @formatstring) ‘Zero’, FORMAT(0.123, @formatstring) ‘Rounded to Zero’;

输出:

+----------------+-----------------+----------+-------------------+
| Positive       | Negative        | Zero     | Rounded to Zero   |
|----------------+-----------------+----------+-------------------|
| 123 (Positive) |  123 (Negative) |  0 (Zero |  0 (Zero          |
+----------------+-----------------+----------+-------------------+

示例 7 – 三个部分(包括一个空部分)

如果将第二个格式字符串留空,则第一部分适用于所有非零值。要将其留空,只需在分号之间不留任何内容即可。

法典:

SELECT FORMAT(123, ‘0 (Nonzero);; 0 (Zero)’) ‘Positive’, FORMAT(-123, ‘0 (Nonzero);; 0 (Zero)’) ‘Negative’, FORMAT(0, ‘0 (Nonzero);; 0 (Zero)’) ‘Zero’, FORMAT(0.123, ‘0 (Nonzero);; 0 (Zero)’) ‘Rounded to Zero’;

输出:

+---------------+----------------+-----------+-------------------+
| Positive      | Negative       | Zero      | Rounded to Zero   |
|---------------+----------------+-----------+-------------------|
| 123 (Nonzero) | -123 (Nonzero) |  0 (Zero) |  0 (Zero)         |
+---------------+----------------+-----------+-------------------+

有趣的是,在这种情况下,负值的减号保持不变。

示例 8 – 减号

如前所述,节分隔符忽略与数字关联的任何预先存在的格式。这包括负值的任何减号(尽管前面的示例似乎是例外)。

如果要包含减号,则需要将其显式添加到格式字符串中。下面是示例。

法典:

SELECT FORMAT(-123, ‘0 (P); 0 (N); 0 (Z)’) ‘Without minus sign’, FORMAT(-123, ‘0 (P); -0 (N); 0 (Z)’) ‘With minus sign’;

输出:

+----------------------+-------------------+
| Without minus sign   | With minus sign   |
|----------------------+-------------------|
|  123 (N)             |  -123 (N)         |
+----------------------+-------------------+

如前所述,前面的例子似乎是一个例外,所以要记住一些事情。如果我在上一示例中的负值的格式字符串中添加减号,会发生什么情况:

SELECT FORMAT(-123, ‘-0 (Nonzero);; 0 (Zero)’) Result;

输出:

+-----------------+
| Result          |
|-----------------|
| --123 (Nonzero) |
+-----------------+