T-SQLの文字列の最後の文字を削除しますか?


139

文字列の最後の文字を削除するにはどうすればよいT-SQLですか?

例えば:

'TEST STRING'

戻るには:

'TEST STRIN'

回答:


195

例えば

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

71
または、SELECT LEFT(YourColumnName、LEN(YourColumnName)-1)FROM YourTable
Kyle B.

3
nullキャッチをありがとう-ISNULL(LEFT(@String、LEN(@String)-1)、 'ErrMsg')は解決します
Volvox

2
@Volvoxは、文字列が空の文字列の場合でも例外をスローします。このシナリオを処理するように回答を変更しています。
Imran Rizvi

106

なんらかの理由で列のロジックが複雑な場合(...の場合...の場合...ほかの...終了)、上記のソリューションでは、len()関数で同じロジックを繰り返す必要があります。同じロジックを複製すると混乱になります。これが事実である場合、これは注目に値する解決策です。この例では、最後の不要なカンマを削除します。ようやくREVERSE関数の使い方を見つけました。

select reverse(stuff(reverse('a,b,c,d,'), 1, 1, ''))

6
このコードはNULL、に指定された削除範囲よりも短い文字列を渡すと返されることに注意してくださいSTUFFISNULL空の文字列の場合の別の出力値を取得するには、それをでラップします。
Rozwel

11
これを外側の適用で使用し、for xml path( '')を使用して末尾のカンマを削除します。awseome
Tracker1

@ Tracker1と同じです。LEN()に関係するものとは異なり、これは(特にISNULL()でラップされた)空の文字列に対して(何も繰り返さずに)正常に機能します
gregmac

ときどき残酷なSQLが発生する可能性があることは、本当に驚くべきことです。これが信じられない。
eouw0o83hf 2013

おかげで、助けてくれました。私の場合、最後のスペースがあったので、最初のインデックスは2ですselect reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Arngue

52

これを試して:

select substring('test string', 1, (len('test string') - 1))

@エイドリアンはこれが同じ結果をもたらすように見える理由を教えてselect substring('test string', 0, len('test string'))ください?
Louis Waweru 2013年

@Louis、部分文字列の構文は次のとおりですSUBSTRING ( expression ,start , length )。これで、番号付けが1ベースであるため、両方のクエリは同じ結果を返します。つまり、式の最初の文字は1です。startが1より小さい場合、返される式は、expressionで指定された最初の文字から始まります。出典
JS5

26

文字列が空の場合、

DECLARE @String VARCHAR(100)
SET @String = ''
SELECT LEFT(@String, LEN(@String) - 1)

このコードは、エラーメッセージ「無効な長さパラメーターがサブストリング関数に渡されました」を引き起こします。

次のように処理できます。

SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))

結果は常に返され、空の文字列の場合はNULLが返されます。



9

これは、ソースtext / varがnullまたは空の場合でも機能します。

SELECT REVERSE(SUBSTRING(REVERSE(@a), 2, 9999))

2
これは過小評価されたコメントであり、高速であり、機能するために文字列を2回選択する必要はありません。
Randall

7

あなたのコラムがでtextありでない場合、varcharこれを使用できます:

SELECT SUBSTRING(@String, 1, NULLIF(DATALENGTH(@String)-1,-1))

5

REVERSE-STUFF-REVERSEの3つではなく2つのステップでこれを実行する場合は、リストのセパレーターを1つまたは2つのスペースにすることができます。次に、RTRIMを使用して末尾のスペースを削除し、REPLACEを使用して二重スペースを「、」で置き換えます

select REPLACE(RTRIM('a  b  c  d  '),'  ', ', ')

ただし、元の文字列に内部スペースが含まれる可能性がある場合、これはお勧めできません。

パフォーマンスについてはわかりません。各REVERSEは文字列の新しいコピーを作成しますが、STUFFはREPLACEより3分の1高速です。

これも見る




2

関数を作成できます

CREATE FUNCTION [dbo].[TRUNCRIGHT] (@string NVARCHAR(max), @len int = 1)
RETURNS NVARCHAR(max)
AS
BEGIN
    IF LEN(@string)<@len
        RETURN ''
    RETURN LEFT(@string, LEN(@string) - @len)
END


2

最後のキャラクターを取得

Right(@string, len(@String) - (len(@String) - 1))

これは彼が求めていたものではないと私は思う-しかし、これはコメントを書くのに役立つかもしれない。
jimwise 2013年

3
Just Right(@string、1)。
GoalBased 2014

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

1

これはかなり遅いですが、興味深いことにまだ言及されていません。

select stuff(x,len(x),1,'')

つまり:

take a string x
go to its last character
remove one character
add nothing

0

@ 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

クエリの複合部分に外部/クロス適用を使用することもできます。これを使用して、親アイテムのフラグのセットを取得します。
Tracker1 2013年

0

特定の列の最後のN文字をトリミングしてレコードを更新するには:

UPDATE tablename SET columnName = LEFT(columnName , LEN(columnName )-N) where clause

0

それを試してみてください :

  DECLARE @String NVARCHAR(100)
    SET @String = '12354851'
    SELECT LEFT(@String, NULLIF(LEN(@String)-1,-1))

0
declare @string varchar(20)= 'TEST STRING'
Select left(@string, len(@string)-1) as Tada

出力:

Tada
--------------------
TEST STRIN

0

これを試して、

DECLARE @name NVARCHAR(MAX) SET @name='xxxxTHAMIZHMANI****'SELECT Substring(@name, 5, (len(@name)-8)) as UserNames

そして出力は、タミズマニのようになります


-1
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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.