Предположим, что у меня есть строка 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
заканчивается запятой, но не начинается с нее.
В первом случае удаляются первый и последний символы; во втором случае самый левый символ удаляется; в последнем случае конечный символ удаляется.
Ответ 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
Ответ 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