右键填充具有可变数量空格的字符串

时间:2012-09-19 18:52:06

标签: sql-server ssrs-2008

我有一个客户表,我想用它来填充SSRS 2008中的参数框。cust_num是值,cust_namecust_addr的串联将是标签。表中的必填字段为:

cust_num     int            PK
cust_name    char(50)       not null
cust_addr    char(50)

SQL是:

select cust_num, cust_name + isnull(cust_addr, '') address
from customers

在参数列表中给出了这个:

FIRST OUTPUT - ACTUAL
1       cust1              addr1
2       customer2               addr2

这是我的预期,但我想要:

SECOND OUTPUT - DESIRED
1       cust1              addr1
2       customer2          addr2

我尝试过:

select cust_num, rtrim(cust_name) + space(60 - len(cust_name)) +
                 rtrim(cust_addr) + space(60 - len(cust_addr)) customer
from customers

这给了我第一个输出。

select cust_num, rtrim(cust_name) + replicate(char(32), 60 - len(cust_name)) +
                 rtrim(cust_addr) + replicate(char(32), 60 - len(cust_addr)) customer

这也给了我第一个输出。

我也尝试将space()替换为char(32),反之亦然

我尝试过substringleftright的各种变体都无济于事。

我还在各个地方使用了ltrimrtrim

60的原因是我检查了两个字段中的最大长度并且它是50并且我希望字段之间有一些空格,即使字段是最大的。我并不真正关心截断的数据,因为城市,州和邮政在不同的领域,所以如果街道地址的末尾被砍掉,我猜是可以的。

这不是一个显示阻止,SSRS报告目前已部署第一个输出,但我想让它更清洁,如果我可以。

5 个答案:

答案 0 :(得分:63)

Whammo blammo(领先空间):

SELECT 
    RIGHT(space(60) + cust_name, 60),
    RIGHT(space(60) + cust_address, 60)

OR(用于尾随空格)

SELECT
    LEFT(cust_name + space(60), 60),
    LEFT(cust_address + space(60), 60),

答案 1 :(得分:3)

这是基于Jim的回答,

SELECT
    @field_text + SPACE(@pad_length - LEN(@field_text)) AS RightPad
   ,SPACE(@pad_length - LEN(@field_text)) + @field_text AS LeftPad

优点

  • 更直接前进
  • 稍微清洁(IMO)
  • 更快(可能?)
  • 轻松修改为双垫以显示非固定宽度字体或分割填充左右中心

缺点

  • 不处理LEN(@field_text)> @pad_length

答案 2 :(得分:2)

最简单的用空格填充字符串(不修剪空格)的方法是将字符串简单地转换为CHAR(length)。 MSSQL有时会修剪VARCHAR中的空格(因为它是可变长度数据类型)。由于CHAR是固定长度的数据类型,因此SQL Server将永远不会修剪尾随空格,并且会自动用空格填充比其长度短的字符串。例如,请尝试以下代码片段。

SELECT CAST('Test' AS CHAR(20))

这将返回值'Test '

答案 3 :(得分:0)

基于KMier's answer,解决了当要填充的字段不是字段时该方法存在问题的注释,但是(可能是复杂的)函数的结果;整个功能必须重复。

此外,这允许将字段填充到其内容的最大长度。

WITH
cte AS (
  SELECT 'foo' AS value_to_be_padded
  UNION SELECT 'foobar'
),
cte_max AS (
  SELECT MAX(LEN(value_to_be_padded)) AS max_len
)
SELECT
  CONCAT(SPACE(max_len - LEN(value_to_be_padded)), value_to_be_padded AS left_padded,
  CONCAT(value_to_be_padded, SPACE(max_len - LEN(value_to_be_padded)) AS right_padded;

答案 4 :(得分:0)

declare @t table(f1 varchar(50),f2 varchar(50),f3 varchar(50))
    
insert into @t values
 ('foooo','fooooooo','foo')
,('foo','fooooooo','fooo')
,('foooooooo','fooooooo','foooooo')

select 
    concat(f1
          ,space(max(len(f1)) over () - len(f1))
          ,space(3)
          ,f2
          ,space(max(len(f2)) over () - len(f2))
          ,space(3)
          ,f3
          )
from @t

结果

foooo       fooooooo   foo
foo         fooooooo   fooo
foooooooo   fooooooo   foooooo