2012-02-13 375 views
31

Tengo tabla con datos 1/1 a 1/20 en una columna. Quiero el valor de 1 a 20, es decir, el valor después de que '/' (barra frontal) se actualice en otra columna en la misma tabla en SQL Server.Cómo dividir una cadena después de un carácter específico en SQL Server y actualizar este valor a la columna específica

Ejemplo:

columna tiene un valor 1/1,1/2,1/3...1/20
nuevo valor Columna 1,2,3,..20

es decir Quiero actualizar esta nueva columna

Gracias por adelantado ...!

Respuesta

70

Prueba esto:

UPDATE YourTable 
SET Col2 = RIGHT(Col1,LEN(Col1)-CHARINDEX('/',Col1)) 
+0

excelente idea para combinar 'charindex' con' derecha' - también funciona con 'left', really cool :) –

+1

Me necesitaba solo, y también funciona en DB2 si sub' LEN' con 'LENGTH' y' CHARINDEX' con 'LOCATE' –

1

Tal vez algo como esto:

En primer lugar algunos datos de prueba:

DECLARE @tbl TABLE(Column1 VARCHAR(100)) 

INSERT INTO @tbl 
SELECT '1/1' UNION ALL 
SELECT '1/20' UNION ALL 
SELECT '1/2' 

Luego de esta manera:

SELECT 
    SUBSTRING(tbl.Column1,CHARINDEX('/',tbl.Column1)+1,LEN(tbl.Column1)) 
FROM 
    @tbl AS tbl 
-1
SELECT emp.LoginID, emp.JobTitle, emp.BirthDate, emp.ModifiedDate , 
     CASE WHEN emp.JobTitle NOT LIKE '%Document Control%' THEN emp.JobTitle 
      ELSE SUBSTRING(emp.JobTitle,CHARINDEX('Document Control',emp.JobTitle),LEN('Document Control')) 
     END 
     ,emp.gender,emp.MaritalStatus 
FROM HumanResources.Employee [emp] 
WHERE JobTitle LIKE '[C-F]%' 
+0

Las publicaciones de solo códigos son desaconsejables aquí. Tal vez deberías incluir una explicación. –

+0

sin explicaciones? y el uso de nombres de columnas no relacionadas! –

-1

Use CHARINDEX. Quizás haga que el usuario funcione. Si usa esta división a menudo.
me gustaría crear esta función:

CREATE FUNCTION [dbo].[Split] 
(
    @String VARCHAR(max), 
    @Delimiter varCHAR(1) 
) 
RETURNS TABLE 
AS 
RETURN 
(
    WITH Split(stpos,endpos) 
    AS(
     SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos 
     UNION ALL 
     SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1) 
      FROM Split 
      WHERE endpos > 0 
    ) 
    SELECT 'INT_COLUMN' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)), 
     'STRING_COLUMN' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos) 
    FROM Split 
) 
GO 
+0

Por favor, elabore. Tu respuesta es vaga – mzedeler

-1

Desde: http://www.sql-server-helper.com/error-messages/msg-536.aspx

Para utilizar la función de la izquierda si no todos los datos se presenta en forma '1/12' necesita esta en la segunda línea anterior:

Set Col2 = LEFT(Col1, ISNULL(NULLIF(CHARINDEX('/', Col1) - 1, -1), LEN(Col1))) 
+0

Gracias Soner Gönül! – Miguel

+0

Supongo que alguien no entendió lo que quise decir. Sus datos: 1/1; 1/2; 2/1; 2/2; 2/3; 3; 4/1; Es posible que tenga un error en "3" debido a la subparte faltante. – Miguel

6

La búsqueda a continuación también divide la cadena con delímetro.

Select Substring(@String1,0,CharIndex(@delimeter,@String1)) 
-1
SELECT SUBSTRING(ParentBGBU,0,CHARINDEX('-',ParentBGBU,0)) FROM dbo.tblHCMMaster; 
+0

puede no ser útil para esta pregunta, pero esta respuesta me ahorra 1 hora de búsqueda de Google.me da mi resultado esperado como 'A5/LS/CHMB/17-18/WAI' será' A5 ' –

0

Sé que esta pregunta es específica de SQL Server, pero yo estoy usando PostgreSQL y encontré esta pregunta, así que para cualquier otra persona en una situación similar, existe la función split_part(string text, delimiter text, field int).

Cuestiones relacionadas