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 в настоящее время развернут с первым выходом, но я хотел бы сделать его более чистым, если смогу.
Ответы
Ответ 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 '
.