wake-up-neo.com

Rechts füge eine Zeichenfolge mit variabler Anzahl von Leerzeichen ein

Ich habe eine Kundentabelle, die ich verwenden möchte, um ein Parameterfeld in SSRS 2008 auszufüllen. Der cust_num ist der Wert und die Verkettung von cust_name und cust_addr wird das Etikett sein. Die erforderlichen Felder aus der Tabelle sind:

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

Die SQL lautet:

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

Was gibt mir das in der Parameterliste:

FIRST OUTPUT - ACTUAL
1       cust1              addr1
2       customer2               addr2

Was ich erwartet habe, aber ich möchte:

SECOND OUTPUT - DESIRED
1       cust1              addr1
2       customer2          addr2

Was ich versucht habe:

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

Was mir die erste Ausgabe gibt.

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

Was mir auch die erste Ausgabe gibt.

Ich habe auch versucht, space() durch char(32) zu ersetzen und umgekehrt

Ich habe Variationen von substring, left, right ausprobiert, alles ohne Erfolg.

Ich habe auch ltrim und rtrim an verschiedenen Stellen verwendet.

Der Grund für die 60 ist, dass ich die maximale Länge in beiden Feldern geprüft habe und es 50 ist und ich etwas Leerzeichen zwischen den Feldern haben möchte, auch wenn das Feld maximal ist. Ich bin nicht wirklich besorgt über abgeschnittene Daten, da Stadt, Bundesland und Postleitzahl in verschiedenen Feldern liegen. Wenn also das Ende der Straße abgeschnitten ist, ist es in Ordnung, denke ich.

Dies ist kein Show-Stopper. Der SSRS-Bericht wird derzeit mit der ersten Ausgabe bereitgestellt. Ich würde ihn jedoch gerne sauberer machen, wenn ich kann.

23
Tony

Whammo Blammo (für führende Räume):

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

ODER (für nachgestellte Leerzeichen)

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

Dies basiert auf Jims Antwort,

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

Vorteile 

  • Direkter
  • Etwas Reiniger (IMO)
  • Schneller (vielleicht?)
  • Einfach geändert, entweder in Doppelfeld für die Anzeige von Schriftarten mit nicht fester Breite oder in geteilter Füllung links und rechts in der Mitte 

Nachteile

  • Behandelt LEN (@field_text)> @pad_length nicht 
3
KMier

Die einfachste Möglichkeit, eine Zeichenfolge mit Leerzeichen (ohne sie zu beschneiden) mit der rechten Maustaste zu füllen, besteht darin, die Zeichenfolge einfach als CHAR (length) umzuwandeln. MSSQL schneidet manchmal Leerzeichen von VARCHAR ab (da es sich um einen Datentyp mit variabler Länge handelt). Da es sich bei CHAR um einen Datentyp mit fester Länge handelt, schneidet SQL Server die nachgestellten Leerzeichen niemals ab und füllt Zeichenfolgen, die kürzer als seine Länge sind, automatisch mit Leerzeichen auf. Versuchen Sie beispielsweise den folgenden Codeausschnitt.

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

Dies gibt den Wert 'Test ' zurück.

2
Justin C

Basierend auf der Antwort von KMier wird der Kommentar angesprochen, dass diese Methode ein Problem darstellt, wenn das aufzufüllende Feld kein Feld ist, sondern das Ergebnis einer (möglicherweise komplizierten) Funktion; Die gesamte Funktion muss wiederholt werden.

Dies ermöglicht auch das Auffüllen eines Felds auf die maximale Länge seines Inhalts.

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;
0
SQB