web-dev-qa-db-ja.com

可変数のスペースで文字列を右詰め

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)に置き換えようとしました。

substringleftrightのバリエーションをすべて試しましたが、まったく役に立ちませんでした。

また、さまざまな場所でltrimrtrimを使用しました。

60の理由は、両方のフィールドの最大長をチェックし、それが50であり、フィールドが最大化されていてもフィールド間に空白が必要だからです。都市、州、および郵便番号が異なるフィールドにあるため、切り捨てられたデータについてはあまり心配していません。

これはショーストッパーではありません。SSRSレポートは現在、最初の出力で展開されていますが、できる限り簡潔にしたいと思います。

24
Tony

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),
65
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を処理しません
4
KMier

文字列をスペースで右詰めする最も簡単な方法は、文字列をCHAR(length)としてキャストすることです。 MSSQLは、VARiable-lengthデータ型であるため、VARCHARから空白を削除することがあります。 CHARは固定長のデータ型であるため、SQL Serverは末尾のスペースを削除せず、その長さより短い文字列をスペースで自動的に埋め込みます。たとえば、次のコードスニペットを試してください。

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

これは、値'Test 'を返します。

2
Justin C

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