Как удалить определенный символ из строки, только когда это первый или последний символ в строке.

Предположим, что у меня есть строка 1,2,3, Я хотел бы удалить последний ,, или если строка выглядит как ,1,2,3, или ,1,2,3, мне бы хотелось получить 1,2,3 в качестве моего результата. И, пожалуйста, попробуйте пояснить в своем ответе. Я не просто хочу копировать материалы пасты, не понимая их. Спасибо.

Ответ 1

Один из способов решения таких "подрезных" запятых - использование выражения CASE:

CASE
    WHEN str LIKE ',%,' THEN SUBSTRING(str, 2, LEN(str)-2)
    WHEN str LIKE ',%'  THEN RIGHT(str, LEN(str)-1)
    WHEN str LIKE '%,'  THEN LEFT(str, LEN(str)-1)
    ELSE str
END

Это очень самоочевидно: оператор CASE рассматривает три ситуации -

  • Когда строка str имеет запятые с обеих сторон,
  • Когда строка str начинается в запятой, но не заканчивается на одну, а
  • Когда строка str заканчивается запятой, но не начинается с нее.

В первом случае удаляются первый и последний символы; во втором случае самый левый символ удаляется; в последнем случае конечный символ удаляется.

Демо на sqlfiddle.

Ответ 2

declare @str varchar(20)=',1,2,3,'

select   case
         when @str like ',%,' then stuff(stuff(@str, 1, 1, ''),LEN(stuff(@str, 1, 1, '')),1,'')

         when @str like ',%' then stuff(@str, 1, 1, '')

         when @str like '%,' then stuff(@str, LEN(@str), 1, '')

         else @str
         end

Ответ 3

dept_name - это имя столбца, а "I" - символ, который вы хотите заменить.

SELECT REPLACE(Dept_Name,'I','')
FROM [Newone].[dbo].[Department]
where Dept_Name like 'I%' or Dept_Name like  '%I'

Ответ 4

CASE будет работать здесь. Я думаю примерно так:

CASE 

WHEN ISNUMERIC(RIGHT(YourString, 1)) <> 1 AND ISNUMERIC(LEFT(YourString, 1)) <> 1
THEN SELECT MID(YourString, 2, LEN(YourString) - 2)

WHEN ISNUMERIC(RIGHT(YourString, 1)) <> 1
THEN SELECT LEFT(YourString, LEN(YourString) -1)

WHEN ISNUMERIC(LEFT(YourString, 1)) <> 1
THEN SELECT RIGHT(YourString, LEN(YourString) - 1)

ELSE SELECT YourString

END

Это работает независимо от того, что характер, так как он проверяет, являются ли первые и последние числовыми первыми, если не получить вашу новую строку, еще проверьте, является ли конец числовым, если не выбрать строку, кроме конца, else проверьте, является ли начало числовым, если не выбрать строку, кроме начала, иначе получите свою строку.

Ответ 5

Если вам нужно заменить только одну запятую (как в исходном вопросе) в начале или в конце, тогда:

CASE
    WHEN str LIKE '%,%' THEN 
       SUBSTRING(str, IIF(LEFT(str,1)=',',2,1), 
                      LEN(str)-IIF(LEFT(str,1)=',',1,0)
                              -IIF(RIGHT(str,1)=',',1,0))
    ELSE str
END

Если ,,,,1,2,3,,,, возможно, используйте PATINDEX() с помощью маски '%[0-9]%:

CASE
    WHEN str LIKE '%,%' THEN 
       SUBSTRING(str, PATINDEX('%[0-9]%',str), 
                      LEN(str)-(PATINDEX('%[0-9]%',str)-1)
                              -(PATINDEX('%[0-9]%',REVERSE(str))-1))
    ELSE str

END

демоверсия SQLFiddle

Ответ 6

Несколько вариантов, все с использованием SQLCLR, если это то, к чему вам не разрешен доступ. Вы можете написать свои собственные функции для выполнения этих задач, но примеры, которые я покажу, основаны на библиотеке SQL # (SQLsharp). Я являюсь автором библиотеки SQL #, но первые 2 примера используют функции, доступные в бесплатной версии. Третий пример, используя TrimChars(), не является бесплатным, но я включил его для полноты, так как это было просто так;-). В каждом примере символы внутри дополнительных или дополнительных запятых могут быть любыми.

  • Несколько простое регулярное выражение для использования в группе Capture для получения всего от первого значения не запятой через последнее значение без запятой:

    SELECT SQL#.RegEx_CaptureGroup(N',,12,123,12334,567,,,,,',
                                   N'^,*(.+?),*$', -- Regular Expression
                                   1, -- Capture Group to return
                                   '', -- not found replacement
                                   1, -- Start At position
                                   -1, -- Length
                                   '' -- RegEx Options
                                   )
    
  • Если причина для удаления дополнительных запятых - получить чистый список для разделения, вы можете разбить их, а функция split удаляет пустые значения для вас и, следовательно, не нужно беспокоиться о том, где пустые значения, даже если посередине:

    SELECT *FROM SQL#.String_Split(N',,12,123,12334,567,,,,,', N',', 2)
    -- 2 = remove empty values
    
  • Вы можете сделать простую Trim, которая удаляет указанный символ с обеих сторон, пока не найдет символ, который не является символом для Trim:

    SELECT SQL#.String_TrimChars(N',,12,123,12334,567,,,,,', N',')
    

Ответ 7

Если вы просто хотите удалить конечную запятую, в SQL Server я бы использовал функцию STUFF, и она выглядела бы примерно так:

SELECT STRING, stuff(string, (len(string) - 1),1,'') as newstring
from yourtable

Ответ 8

Попробуйте это. ОБРАТНЫЙ (SUBSTRING (ОБРАТНЫЙ (FLD), 2, LEN (FLD))) Он всегда будет принимать последнего персонажа независимо. Вы можете поставить оператор CASE WHEN, чтобы последний символ был запятой, просто говоря CASE WHEN REVERSE (SUBSTRING (fld, 1,1)) = ',' THEN REVERSE (SUBSTRING (REVERSE (fld), 2, LEN (fld) )) ELSE fld END fld