Select 'long' 数据类型,使用 Substring 或 Right/Left 格式化输出

Select 'long' data type with formatted output using Substring or Right/Left

我的 select 语句 returns 不能用作子字符串表达式的长值列表。 我的查询返回的值是 9 或 10 位数字长。如果它是 9 位数字长例如 123456789 我想要结果像 0-123-456-789 否则如果是 3123456789 这样的 10 位数字我想要它作为 3-123-456-789.

是否有像'right'或'left'这样的函数可以类似于子字符串使用 即有 3 个参数,我可以在其中提及起点。

只需指出正确的方向,例如函数名称或在 select 语句中使用格式化函数的正确方法。

使用 Stuff and Right 字符串函数来执行此操作。

DECLARE @digits Bigint=3123456789

SELECT Stuff(Stuff(Stuff(RIGHT('0'+ convert(varchar(10),@digits),10),2,0, '-'),6,0, '-'),10,0,'-') 

结果: 3-123-456-789

重要提示:格式化应该留给您的表示层,而不是您的数据库。

话虽这么说,如果您决定格式化这些值,那么您将必须先将它们转换为字符串!

SELECT your_field As original_value
     , Cast(your_field As varchar(10)) As stringified
     , '0000000000' + Cast(your_field As varchar(10)) As pad_with_zeroes
     , Right('0000000000' + Cast(your_field As varchar(10)), 10) As trim_to_ten_characters
FROM   your_table

您的格式设置变得简单:

SELECT original_value
     , trim_to_ten_characters
     , SubString(trim_to_ten_characters, 1, 1)
     + '-'
     , SubString(trim_to_ten_characters, 2, 3)
     + '-'
     , SubString(trim_to_ten_characters, 5, 2)
     + '-'
     , SubString(trim_to_ten_characters, 8, 3) As formatified
     , Stuff(Stuff(Stuff(trim_to_ten_characters, 8, 0, '-'), 5, 0, '-'), 2, 0, '-') As alternative_method
FROM   (
        <that query from above>
       ) As aliased_query