Як видалити перші символи певного стовпця з таблиці?


162

Як в SQL можна видалити перші 4 символи значень певного стовпця в таблиці? Назва стовпця є, Student Codeа приклад значення - ABCD123Stu1231. Я хочу видалити перші 4 символи зі своєї таблиці для всіх записів

Будь ласка, направляйте мене

Відповіді:


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

Редагувати: Щоб пояснити, ПРАВО приймає 2 аргументи - рядок (або стовпець), на який потрібно працювати, і кількість символів, які потрібно повернути (починаючи з "правої" частини рядка). LEN повертає довжину даних стовпців, і ми віднімаємо чотири, щоб наша функція ВПРАВО залишала крайні ліві 4 символи «позаду».

Сподіваюся, це має сенс.

Знову редагуйте - я щойно прочитав відповідь Ендрю, і він, можливо, добре взаємодіяв, і я можу помилитися. Якщо це так (і ви хочете оновити таблицю, а не просто повертати докторовані результати), ви можете зробити це:

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

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


9
це не вдасться для значень <4 символів. Ви повинні додати блок справ, щоб повернути значення стовпця для <4.
Скотт Айві

2
Найімовірніше, найкращим способом впоратися з цим було б просто: ОНОВЛЕННЯ MyTableSET MyColumn = ВПРАВО (MyColumn, LEN (MyColumn) - 4) WHERE LEN (MyColumn)> 4 SUBSTRING не помилиться, але це також зайве "оновлення" рядків з меншою кількістю чотирьох символів. Зважаючи на це, в ОП вказувалося, що вони хочуть обрізати перші 4 символи конкретного стовпця - я вважаю, якщо не буде надано більш детальну інформацію про те, що ВСІ рядки потрібно обрізати.
Аарон Алтон

1
@ spencer7593 - ха-ха ... правда. Ви завжди можете додати пункт WHERE, щоб бути безпечним: WHERE NOT ISNUMERIC (ЛІВО (MyColumn, 1))
Aaron Alton,

Чи безпечно називати це в стовпці NULL? Чи сталося б у цьому випадку?
Ян Р. О'Брайен

Я закінчив використовувати COL_LENGTH('MyTable', 'MyColumn')замість того, LEN(MyColumn)що в моєму випадку я хотів виключити перші n символів, незалежно від розміру фактичного вмісту в стовпці, але це спрацювало інакше, ніж це!
sfarbota

86
Stuff(someColumn, 1, 4, '')

Це говорить, починаючи з першого 1положення символу, замінюйте 4символи нічим''


7
Старе питання я знаю, але я вважаю за краще це рішення, оскільки воно не використовує більше 1 функції або має в ньому якусь випадкову велику кількість.
Едвін Стотелер

4
Навіть більше: якщо someColumnце щось складне, як підбір з CTE або somehting, для цього не потрібно його оцінювати двічі.
Джефф

1
FYI, це рішення також дуже добре працює для обрізання числових значень.
Стівен Балл

1
щоб збільшити те, що ви сказали, ось завершений результат. спочатку зробіть вибір, переконайтеся, що ур отримує потрібні рядки, а потім отримайте це право в цьому оновлення. ПРИМІТКА / будьте обережні - після успішного запуску не запускайте його знову, оскільки воно без розбору відрізає перші 4 символи: оновлення набору таблиці textField = (ВИБІРТЕ НАСТРОЙКА (CONVERT (VARCHAR (MAX), textField)), textField), 1, 4, '' ') де Activitytype = 'A' та затверджене дата> '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
Дякую, це спрацювало добре для мене як разова річ. Прийнята відповідь чомусь подрібнювала додаткових символів, але це працює бездоганно.
користувач2366842

2
@ user2366842 Ймовірна причина, чому за допомогою прийнятої відповіді було відсікання додаткових символів, це те, що у вас, ймовірно, були пробіли у тексті. Ви можете компенсувати це, якщо хочете, використовуючи RTRIM & LTRIM.
Spazmoose


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 (кількість символів, пропущених на початку).



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)

  


3

Верхня відповідь не підходить, коли значення можуть мати довжину менше 4.

У T-SQL

Ви отримаєте "Недійсний параметр довжини, переданий правильній функції", оскільки він не приймає негативів. Використовуйте оператор CASE:

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

У Постгресі

Значення менше 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 не дозволяє негативні параметри. Я отримую повідомлення про помилку "Недійсний параметр довжини переданий правильній функції".
palota

Я не помітив теги. Розділіть відповідь на розділи T-SQL та Postgres. Дякую.
Номенон


2

Було б добре поділитися. Для використання DB2: INSERT(someColumn, 1, 4, '')

Stuff не підтримується в DB2


1

Якщо вам доведеться видалити кілька перших символів, яким передує спеціальний символ, як-от #, це добре:

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.