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) YourTable에서
Kyle B.

3
널 캐치 주셔서 감사합니다-ISNULL (LEFT (@String, LEN (@String)-1), 'ErrMsg') 해결
Volvox

2
@ Volvox 문자열이 빈 문자열 인 경우 여전히 예외가 발생합니다.이 시나리오를 처리하기 위해 답변을 수정하고 있습니다.
Imran Rizvi

106

어떤 이유로 열 논리가 복잡한 경우 (... when ... then ... else ... end), 위의 솔루션으로 인해 len () 함수에서 동일한 논리를 반복해야합니다. 동일한 논리를 복제하면 엉망이됩니다. 이것이 사실이라면 이것은 주목할만한 해결책입니다. 이 예는 마지막 원치 않는 쉼표를 제거합니다. 마침내 REVERSE 기능을 사용했습니다.

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

6
이 코드는에 NULL지정된 삭제 범위보다 짧은 문자열을 전달하면 반환 됩니다 STUFF. ISNULL빈 문자열 케이스에 대해 다른 출력 값을 얻으려면 에 감싸십시오 .
Rozwel

11
쉼표를 제거하기 위해 xml 경로 (``)와 함께 외부 적용과 함께 사용하면 좋습니다. awseome
Tracker1

@ Tracker1과 같은 방법입니다. LEN ()과 관련이있는 것과는 달리 이것은 빈 문자열 (특히 ISNULL ()에 싸여 있음)에 대해 아무 것도 반복하지 않고 정상적으로 작동합니다.
gregmac

때로는 잔인한 SQL이 얼마나 될 수 있는지가 정말 놀랍습니다. 이것은 믿기 힘든 일이야.
eouw0o83hf

감사합니다, 그것은 첫 번째 인덱스는 2 그래서 내가 마지막 공간을 가지고 내 경우에는, 저를 도와select reverse(stuff(reverse('a,b,c,d,'), 2, 1, ''))
Arngue

52

이 시도:

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

@Adrien 이것이 왜 같은 결과를 제공하는 것 같 select substring('test string', 0, len('test string'))습니까?
Louis Waweru

@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

소스 텍스트 / var이 null이거나 비어있는 경우에도 작동합니다.

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

2
이것은 과소 평가 된 의견이며 빠르며 작동하기 위해 문자열을 두 번 선택할 필요가 없습니다.
랜달

7

당신의 coloumn이 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보다 세 번째 빠릅니다.

또한 이것을보십시오




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

이 시도

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

2

마지막 캐릭터를 얻으십시오

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

나는 이것이 그가 요구 한 것이라고 생각하지 않습니다. 그러나 이것은 의견을 제시하는 것이 유용 할 수 있습니다.
jimwise

3
딱 맞습니다 (@string, 1).
목표 기반

1

내 대답은 허용되는 대답과 비슷하지만 Null 및 Empty String도 확인합니다.

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 함수에 두 세트의 괄호가 필요했기 때문에 따라 잡았습니다. 저것을 알아내는 데 시간이 걸렸습니다!

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

쿼리의 복합 부분에 외부 / 교차 적용을 사용할 수 있습니다. 부모 항목에 대한 플래그 세트를 얻기 위해 이것을 사용하고 있습니다.
추적자

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

출력은 THAMIZHMANI와 같습니다.


-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.