Como removo os primeiros caracteres de uma coluna específica de uma tabela?


162

No SQL, como posso remover os 4 primeiros caracteres dos valores de uma coluna específica em uma tabela? O nome da coluna é Student Codee um valor de exemplo é ABCD123Stu1231. Quero remover os 4 primeiros caracteres da minha tabela para todos os registros

Por favor me guie

Respostas:


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

Editar: Para explicar, RIGHT leva 2 argumentos - a string (ou coluna) para operar e o número de caracteres a serem retornados (começando no lado "direito" da string). LEN retorna o comprimento dos dados da coluna e subtraímos quatro para que nossa função DIREITA deixe os 4 caracteres mais à esquerda "para trás".

Espero que isso faça sentido.

Edite novamente - Acabei de ler a resposta de Andrew, e ele pode muito bem ter interferido corretamente, e posso estar enganado. Se for esse o caso (e você deseja atualizar a tabela em vez de apenas retornar resultados medicados), faça o seguinte:

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

Ele está no caminho certo, mas sua solução manterá os 4 caracteres no início da sequência, em vez de descartar os 4 caracteres.


9
isso falhará para valores com <4 caracteres. Você deve adicionar um bloco caso para retornar o valor da coluna de <4.
Scott Ivey

2
Provavelmente, a melhor maneira de lidar com isso seria simplesmente: UPDATE MyTableSET MyColumn = RIGHT (MyColumn, LEN (MyColumn) - 4) WHERE LEN (MyColumn)> 4 com menos de quatro caracteres. Dito isto, o OP indicou que eles queriam aparar os 4 primeiros caracteres de uma coluna específica - eu diria que, a menos que sejam fornecidos mais detalhes, TODAS as linhas precisam ser cortadas.
Aaron Alton

1
@ spencer7593 - hahaha ... é verdade. Você pode sempre adicionar uma cláusula WHERE para ser seguro: ONDE NÃO IsNumeric (LEFT (MyColumn, 1))
Aaron Alton

É seguro chamar isso em uma coluna NULL? Isso aconteceria neste caso?
Ian R. O'Brien

Acabei usando, em COL_LENGTH('MyTable', 'MyColumn')vez de, LEN(MyColumn)porque, no meu caso, queria excluir os primeiros n caracteres, independentemente do tamanho do conteúdo real da coluna, mas isso funcionou bem além disso!
precisa saber é o seguinte

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

Isto diz que, começando com a 1posição do primeiro caractere, substitua os 4caracteres por nada''


7
Pergunta antiga, eu sei, mas prefiro essa solução, pois ela não usa mais de uma função ou tem um grande número aleatório.
Edwin Stoteler

4
Ainda mais: se someColumné algo complexo como uma subseleção de um CTE ou algo assim, isso não requer avaliação duas vezes.
Jeff

1
Para sua informação, esta solução também funciona muito bem para aparar valores numéricos.
1811 Steven Ball

1
para aumentar o que você disse, aqui está um resultado completo. primeiro, selecione, garanta a obtenção das linhas desejadas e, em seguida, acerte nesta atualização. NOTA / cuidado - depois de executado com êxito, não o execute novamente, pois indiscriminadamente corta os primeiros 4 caracteres: atualizar o conjunto de tabelas textField = (SELECT STUFF (CONVERT (VARCHAR (MAX), textField), 1, 4, '')) em que activitytype = 'A' e data aprovada> '30/06/2017' e textField não gostam de '% The County1%' e textField não gostam de '% The County2%' e o resumo não é como '% The County3%') e (12345, ... gama de ID do ... 56789)
dcparham

33

Por que usar o LEN para ter duas funções de string? Tudo que você precisa é o personagem 5 ...

...SUBSTRING (Code1, 5, 8000)...

1
Isso é prova do futuro? É possível que versões futuras do MSSQL usem um tamanho máximo de varchar maior que 8.000?
Desenvolvedor Webs

3
varchar (max) já é maior que 8000 caracteres. Se você colocar len (coluna) que vai funcionar para sempre embora
Gaspa79

2
Ou apenas use 2000000000. Por que adicionar uma função LEN. Não agrega valor e também ignora espaços à direita (se quiser)
GBN

1
Obrigado, isso funcionou bem para mim como algo único. A resposta aceita foi, por algum motivo, cortar caracteres adicionais em alguns casos, mas isso funciona perfeitamente.
user2366842

2
@ user2366842 A provável razão pela qual a resposta aceita estava cortando caracteres adicionais é que você provavelmente tinha espaços à direita no texto. Você pode compensar isso se desejar, usando RTRIM e LTRIM.
Spazmoose 13/05/19

13

Tente o seguinte:

update table YourTable
set YourField = substring(YourField, 5, len(YourField)-3);

7

Aqui está uma maquete simples do que você está tentando fazer :)

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)

Portanto, use a última declaração no campo que você deseja cortar :)

A função SUBSTRING elimina o Código1, iniciando no quinto caractere e continuando pelo comprimento de CODE1 menos 4 (o número de caracteres ignorados no início).


5

A coisa completa

DECLARE @v varchar(10)

SET @v='#temp'

select STUFF(@v, 1, 1, '')
WHERE LEFT(@v,1)='#'

3

Você também pode fazer isso no SQL ..

substring(StudentCode,4,len(StudentCode))

sintaxe

substring (ColumnName,<Number of starting Character which u want to remove>,<length of given string>)

3

Tente isso. 100% trabalhando

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

  


3

A resposta principal não é adequada quando os valores podem ter um comprimento menor que 4.

Em T-SQL

Você receberá "Parâmetro de comprimento inválido passado para a função correta" porque não aceita negativos. Use uma instrução CASE:

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

No Postgres

Valores menores que 4 fornecem o comportamento surpreendente abaixo, em vez de um erro, porque passar valores negativos para RIGHT apara os primeiros caracteres em vez de toda a cadeia. Faz mais sentido usar em seu RIGHT(MyColumn, -5)lugar.

Um exemplo comparando o que você obtém ao usar o "comprimento - 5" da resposta principal em vez de "-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
Qual banco de dados você usa? A pergunta tem tag tsql, mas o T-SQL não permite parâmetros negativos. Recebo a mensagem de erro "Parâmetro de comprimento inválido passado para a função correta".
palota 21/06

Não notei as tags. Divida a resposta nas seções T-SQL e Postgres. Obrigado.
Noumenon


2

Seria bom compartilhar, para o uso do DB2: INSERT(someColumn, 1, 4, '')

Stuff não é suportado no DB2


1

Se você precisar remover os primeiros caracteres precedidos por um caractere especial #, este é um bom:

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.