Подтвердить что ты не робот

Right pad - строка с переменным количеством пробелов

У меня есть таблица клиентов, которую я хочу использовать для заполнения окна параметров в SSRS 2008. cust_num - это значение, а конкатенация cust_name и cust_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, left, right все безрезультатно.

Я также использовал ltrim и rtrim в разных местах.

Причина 60 заключается в том, что я проверил максимальную длину в обоих полях, и мне нужно 50, и я хочу, чтобы между полями было пустое поле, даже если максимальное значение поля. Я не очень беспокоюсь об усеченных данных, так как город, штат и почтовый индекс находятся в разных полях, поэтому, если конец уличного адреса отрублен, это нормально, я думаю.

Это не показательный стоппер, отчет SSRS в настоящее время развернут с первым выходом, но я хотел бы сделать его более чистым, если смогу.

4b9b3361

Ответ 1

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),

Ответ 2

Это основано на ответе Джима,

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

Ответ 3

Основываясь на ответе 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;

Ответ 4

Самый простой способ дополнить строку пробелами (без их обрезки) - просто привести строку как CHAR (длина). MSSQL иногда удаляет пробелы из VARCHAR (потому что это тип данных VARiable-длины). Поскольку CHAR является типом данных фиксированной длины, SQL Server никогда не обрезает конечные пробелы и автоматически дополняет строки, которые меньше его длины, пробелами. Попробуйте следующий фрагмент кода, например.

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

Это возвращает значение 'Test '.