回答:
例えば
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
-- Chop off the end character
SET @String =
CASE @String WHEN null THEN null
ELSE (
CASE LEN(@String) WHEN 0 THEN @String
ELSE LEFT(@String, LEN(@String) - 1)
END
) END
SELECT @String
なんらかの理由で列のロジックが複雑な場合(...の場合...の場合...ほかの...終了)、上記のソリューションでは、len()関数で同じロジックを繰り返す必要があります。同じロジックを複製すると混乱になります。これが事実である場合、これは注目に値する解決策です。この例では、最後の不要なカンマを削除します。ようやくREVERSE関数の使い方を見つけました。
select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))
NULL
、に指定された削除範囲よりも短い文字列を渡すと返されることに注意してくださいSTUFF
。ISNULL
空の文字列の場合の別の出力値を取得するには、それをでラップします。
select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
これを試して:
select substring('test string', 1, (len('test string') - 1))
select substring('test string', 0, len('test string'))
ください?
文字列が空の場合、
DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)
このコードは、エラーメッセージ「無効な長さパラメーターがサブストリング関数に渡されました」を引き起こします。
次のように処理できます。
SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))
結果は常に返され、空の文字列の場合はNULLが返されます。
REVERSE-STUFF-REVERSEの3つではなく2つのステップでこれを実行する場合は、リストのセパレーターを1つまたは2つのスペースにすることができます。次に、RTRIMを使用して末尾のスペースを削除し、REPLACEを使用して二重スペースを「、」で置き換えます
select REPLACE(RTRIM('a b c d '),' ', ', ')
ただし、元の文字列に内部スペースが含まれる可能性がある場合、これはお勧めできません。
パフォーマンスについてはわかりません。各REVERSEは文字列の新しいコピーを作成しますが、STUFFはREPLACEより3分の1高速です。
これも見る
これを試して
DECLARE @String VARCHAR(100)
SET @String = 'TEST STRING'
SELECT LEFT(@String, LEN(@String) - 1) AS MyTrimmedColumn
最後のキャラクターを取得
Right(@string, len(@String) - (len(@String) - 1))
私の答えは受け入れられた答えに似ていますが、ヌルと空の文字列もチェックします。
DECLARE @String VARCHAR(100)
SET @String = 'asdfsdf1'
-- If string is null return null, else if string is empty return as it is, else chop off the end character
SET @String = Case @String when null then null else (case LEN(@String) when 0 then @String else LEFT(@String, LEN(@String) - 1) end ) end
SELECT @String
これはかなり遅いですが、興味深いことにまだ言及されていません。
select stuff(x,len(x),1,'')
つまり:
take a string x
go to its last character
remove one character
add nothing
@ bill-hoenigの回答が大好きです。しかし、私はサブクエリを使用していて、REVERSE関数に2組の括弧が必要だったために追いつきました。それを理解するのにしばらくかかりました!
SELECT
-- Return comma delimited list of all payment reasons for this Visit
REVERSE(STUFF(REVERSE((
SELECT DISTINCT
CAST(CONVERT(varchar, r1.CodeID) + ' - ' + c.Name + ', ' AS VARCHAR(MAX))
FROM VisitReason r1
LEFT JOIN ReasonCode c ON c.ID = r1.ReasonCodeID
WHERE p.ID = r1.PaymentID
FOR XML PATH('')
)), 1, 2, '')) ReasonCode
FROM Payments p
特定の列の最後のN文字をトリミングしてレコードを更新するには:
UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause
declare @x varchar(20),@y varchar(20)
select @x='sam'
select
case when @x is null then @y
when @y is null then @x
else @x+','+@y
end
go
declare @x varchar(20),@y varchar(20)
select @x='sam'
--,@y='john'
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@x + ', ' ,'') +coalesce(@y+',','')
SELECT left(@listStr,len(@listStr)-1)