31

我有一个客户表,我想用它来填充 SSRS 2008 中的参数框。是值, andcust_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)反之亦然

我尝试了 , , 的变体,但substring都无济于事。leftright

我也在各个地方使用ltrimrtrim

60 的原因是我已经检查了两个字段的最大长度,它是 50,即使字段已最大化,我也希望字段之间有一些空格。我并不真正关心截断的数据,因为城市、州和邮政编码位于不同的字段中,所以如果街道地址的末端被截断,我猜是可以的。

这不是一个展示停止器,SSRS 报告当前与第一个输出一起部署,但如果可以的话,我想让它更干净。

4

5 回答 5

80

Whammo blammo(用于前导空格):

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

或(用于尾随空格)

SELECT
    LEFT(cust_name + space(60), 60),
    LEFT(cust_address + space(60), 60),
于 2012-09-19T19:20:20.167 回答
13

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

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

这将返回值'Test '

于 2019-01-16T13:47:09.027 回答
5

这是基于吉姆的回答,

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
于 2016-11-04T22:02:12.333 回答
0

根据KMier 的回答,解决了当要填充的字段不是字段而是(可能很复杂)函数的结果时,此方法会造成问题的评论;必须重复整个功能。

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

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;
于 2017-10-24T08:35:17.930 回答
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
于 2021-05-06T15:24:27.347 回答