Как удалить первые символы определенного столбца в таблице?

162

В SQL, как я могу удалить первые 4 символа значений определенного столбца в таблице? Имя столбца Student Codeи пример значения ABCD123Stu1231. Я хочу удалить первые 4 символа из моей таблицы для всех записей

Пожалуйста, ведите меня

Shyju
источник

Ответы:

259
SELECT RIGHT(MyColumn, LEN(MyColumn) - 4) AS MyTrimmedColumn

Редактировать: Для объяснения, RIGHT принимает 2 аргумента - строку (или столбец), с которой нужно работать, и количество возвращаемых символов (начиная с «правой» части строки). LEN возвращает длину данных столбца, и мы вычитаем четыре, так что наша функция RIGHT оставляет 4 крайних левых символа «позади».

Надеюсь, это имеет смысл.

Отредактируйте снова - я только что прочитал ответ Эндрю, и он вполне мог правильно интерпретировать, и я могу ошибаться. Если это так (и вы хотите ОБНОВИТЬ таблицу, а не просто возвращать поддающиеся проверке результаты), вы можете сделать это:

UPDATE MyTable
SET MyColumn = RIGHT(MyColumn, LEN(MyColumn) - 4)

Он находится на правильном пути, но его решение будет сохранять 4 символа в начале строки, а не отбрасывать указанные 4 символа.

Аарон Альтон
источник
9
это не удастся для значений с <4 символов. Вы должны добавить блок case, чтобы вернуть значение столбца для <4.
Скотт Айви
2
Вероятно, лучший способ справиться с этим будет просто: ОБНОВИТЬ MyTableSET MyColumn = RIGHT (MyColumn, LEN (MyColumn) - 4) ГДЕ LEN (MyColumn)> 4 SUBSTRING не выдаст ошибку, но также излишне «обновит» строки с менее чем четырьмя символами. Тем не менее, ОП указала, что они хотят обрезать первые 4 символа определенного столбца - я бы предположил, если не предоставить более подробную информацию о том, что ВСЕ строки должны быть обрезаны.
Аарон Алтон
1
@ spencer7593 - хахаха ... правда. Вы всегда можете добавить предложение WHERE, чтобы быть в безопасности: WHERE NOT ISNUMERIC (LEFT (MyColumn, 1))
Aaron Alton
Безопасно ли вызывать это в пустом столбце? Случилось бы в этом случае?
Ян Р. О'Брайен
В итоге я использовал COL_LENGTH('MyTable', 'MyColumn')вместо, LEN(MyColumn)потому что в моем случае я хотел исключить первые n символов независимо от размера фактического содержимого в столбце, но это работало хорошо, кроме этого!
сфарбота
86
Stuff(someColumn, 1, 4, '')

Это говорит, начиная с первой 1позиции символа, заменить 4символы ничем''

AaronLS
источник
7
Старый вопрос, который я знаю, но я предпочитаю это решение, так как оно не использует более 1 функции или содержит случайное большое число.
Эдвин Стотелер
4
Более того: если someColumnэто что-то сложное, например, отбор из CTE или что-то в этом роде, это не требует его оценки дважды.
Джефф
1
Кстати, это решение также очень хорошо работает для обрезки числовых значений.
Стивен Болл
1
в дополнение к тому, что вы сказали, вот готовый результат. сначала сделайте выбор, убедитесь, что вы получаете нужные строки, а затем получите это право в этом обновлении. ПРИМЕЧАНИЕ / будьте осторожны - после успешного запуска не запускайте его снова, поскольку он без разбора обрезает первые 4 символа: обновить таблицу set textField = (SELECT STUFF (CONVERT (VARCHAR (MAX), textField), 1, 4, '')) где activitytype = 'A' и Approvedate> '2017-06-30' и textField не похожи на '% The County1%', а textField не похожи на '% The County2%' и аннотации не похожи на '% The County3%') и Activityid в (12345, ... диапазон идентификаторов ... 56789)
dcparham
33

Зачем использовать LEN, чтобы у вас было 2 строковые функции? Все, что вам нужно, это персонаж 5 на ...

...SUBSTRING (Code1, 5, 8000)...
ГБН
источник
1
Это будущее доказательство? Возможно ли, что будущие версии MSSQL будут использовать максимальный размер varchar больше 8000?
Разработчик Вебс
3
varchar (max) уже больше 8000 символов. Если вы поставите len (столбец), он будет работать вечно
Gaspa79
2
Или просто используйте 2000000000. Зачем добавлять функцию LEN. Не добавляет значения, а также игнорирует завершающие пробелы (если вы хотите их)
gbn
1
Спасибо, это сработало для меня как разовая вещь. Принятый ответ был по какой-то причине прерывать дополнительные символы в некоторых случаях, но это работает безупречно.
user2366842
2
@ user2366842 Вероятная причина, по которой при использовании принятого ответа были отрезаны дополнительные символы, заключается в том, что в вашем тексте, вероятно, имеются завершающие пробелы. Вы можете компенсировать это, если хотите, используя RTRIM & LTRIM.
Spazmoose
13

Попробуй это:

update table YourTable
set YourField = substring(YourField, 5, len(YourField)-3);
Эндрю Хэйр
источник
7

Вот простой макет того, что вы пытаетесь сделать :)

CREATE TABLE Codes
(
code1 varchar(10),
code2 varchar(10)
)

INSERT INTO Codes (CODE1, CODE2) vALUES ('ABCD1234','')


UPDATE Codes
SET code2 = SUBSTRING(Code1, 5, LEN(CODE1) -4)

Итак, используйте последнее утверждение для поля, которое вы хотите обрезать :)

Функция SUBSTRING отключает Code1, начиная с символа FIFTH и продолжая в течение длины CODE1 минус 4 (количество символов, пропущенных в начале).

обкрадывать
источник
5

Полная вещь

DECLARE @v varchar(10)

SET @v='#temp'

select STUFF(@v, 1, 1, '')
WHERE LEFT(@v,1)='#'
Higarian
источник
3

Вы также можете сделать это в SQL ..

substring(StudentCode,4,len(StudentCode))

синтаксис

substring (ColumnName,<Number of starting Character which u want to remove>,<length of given string>)
Дургеш Пандей
источник
3

Попробуй это. 100% работает

UPDATE Table_Name
SET RIGHT(column_name, LEN(column_name) - 1)

  

Ilyes
источник
3

Верхний ответ не подходит, если значения могут иметь длину меньше 4.

В T-SQL

Вы получите «Неверный параметр длины, переданный правильной функции», потому что он не принимает отрицательные значения. Используйте оператор CASE:

SELECT case when len(foo) >= 4 then RIGHT(foo, LEN(foo) - 4) else '' end AS myfoo from mytable;

В Postgres

Значения меньше 4 дают удивительное поведение ниже вместо ошибки, потому что передача отрицательных значений в ПРАВО обрезает первые символы вместо всей строки. RIGHT(MyColumn, -5)Вместо этого имеет больше смысла .

Пример сравнения того, что вы получаете, когда используете верхний ответ «длина - 5» вместо «-5»:

create temp table foo (foo) as values ('123456789'),('12345678'),('1234567'),('123456'),('12345'),('1234'),('123'),('12'),('1'), ('');

select foo, right(foo, length(foo) - 5), right(foo, -5) from foo;

foo       len(foo) - 5  just -5   
--------- ------------  -------     
123456789 6789          6789 
12345678  678           678  
1234567   67            67   
123456    6             6    
12345                       
1234      234               
123       3                 
12                          
1                           
Ноумен
источник
1
Какую базу данных вы используете? Вопрос имеет тег tsql, но T-SQL не допускает отрицательных параметров. Я получаю сообщение об ошибке «Недопустимый параметр длины передан правильной функции».
Палота
Я не заметил метки. Разделите ответ на разделы T-SQL и Postgres. Спасибо.
Нумен
2

Есть встроенная функция обрезки, которая идеально подходит для этой цели.

SELECT trim(both 'ag' from 'asdfg');
btrim 
-------
 sdf
(1 riga)

http://www.postgresql.org/docs/8.1/static/functions-string.html

linuxatico
источник
1
Хотя это может быть полезно для пользователей PostgreSQL, OP указал tsql / sql-server в тегах вопроса.
CodeMonkey1313
2

Было бы хорошо поделиться, для использования DB2: INSERT(someColumn, 1, 4, '')

Stuff не поддерживается в DB2

Превосходный Саиф
источник
1

Если вам нужно удалить первые несколько символов, которым предшествует специальный символ, например #, это хороший вариант:

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
Prachita
источник