none
Quitar los numeros y el - del lado derecho de la comlumna? RRS feed

  • Pregunta

  • Buenas amigos soy nuevo en esto de SQL y me han dejado un trabajo en la cual en un tabla llamada  DOCUMENT_TYPE HAY CIERTOS REGISTROS QUE TIENE 2 DÍGITOS NUMÉRICOS SEGUIDO DE UN - NECESITO QUITAR ESOS NUMEROS Y EL -.
    DE TODA LA COLUMNA DE ESA TABLA. pero algunos registros no tiene numero ni -

    mUCHAS GRACIAS POR TODO

    Asi los tengo

    07 - Topografico
    07 - Topografico
    17 - Escritura inicial de la propiedad
    05 - Grafica de asistencia
    06 - Avaluos
    07 - Fotografias
    17 - Escritura inicial de la propiedad
    09 - Estudio legal
    Carta de oferta
    empleo


    LOS NECESITO ASI

    topografico
    Topografico
    Escritura inicial de la propiedad
    Grafica de asistencia
    Avaluos
    Fotografias
    Escritura inicial de la propiedad
    Estudio legal
    Carta de oferta
    empleo


    • Editado TysonWB viernes, 16 de febrero de 2018 2:07
    viernes, 16 de febrero de 2018 2:01

Respuestas

  • La idea es buscar si el patron existe y donde comienza para luego estirpar la cadena.

    SELECT
    	T0.col1,
    	CASE 
    	WHEN T1.col1 = 0 THEN T0.col1 
    	ELSE STUFF(T0.col1, 1, T1.col1 + 3, '') 
    	END AS col2
    FROM
    	(
    	VALUES
    		('07 - Topografico'),
    		('07 - Topografico'),
    		('17 - Escritura inicial de la propiedad'),
    		('05 - Grafica de asistencia'),
    		('06 - Avaluos'),
    		('07 - Fotografias'),
    		('17 - Escritura inicial de la propiedad'),
    		('09 - Estudio legal')
    	) AS T0(col1)
    	CROSS APPLY
    	(VALUES (PATINDEX('%[0-9] - %', T0.col1))) AS T1(col1);
    GO

    La funcion PATINDEX nos sirve para buscar el patron '%[0-9] - %' y si el patron existe pues podemos eliminar la subcadena desde la posicion 1 hasta la posicion indicada por PATINDEX mas 3 caracteres ' - '.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    viernes, 16 de febrero de 2018 13:22
  • Hola TysonWB:

    y porque no extraer los datos, sin modificarlos.

    Te pongo un ejemplo con tus datos. He creado una tabla que se llama pruebas con el script que sigue:

    create table pruebas (id int identity(1,1) primary key,
    descripcion varchar(60));
    
    
    
    insert into pruebas values ('07 - Topografico');
    insert into pruebas values ('17 - Escritura inicial de la propiedad');
    insert into pruebas values ('05 - Grafica de asistencia');
    insert into pruebas values ('06 - Avaluos');
    insert into pruebas values ('07 - Fotografia');
    insert into pruebas values ('17 - Escritura inicial de la propiedad');
    insert into pruebas values ('07 - Estudio Legal');
    insert into pruebas values ('Carta de oferta');
    insert into pruebas values ('empleo');
    select * from pruebas
    
    select case (substring (descripcion,4,1)) when '-' then SUBSTRING(descripcion,6,len(descripcion)) else
    descripcion end as descripcion from pruebas 
    
    

    Como observarás a tenor de los resultados, te devuelve la select que va con el case, lo que solicitas.

    Si tienes que cambiar la columna por lo que sea, no es nada dificil, adaptar esa select a una update.

    Dado que indicas que tu nivel de sql es bajo, recuerda siempre, que las sentencias update, no tienen un volver a atrás por tanto, hay que asegurarse primero de que los cambios a realizar son al 100% correctos, aplicar la máxima de que cuando algo puede salir mal, saldrá y disponer de una copia de seguridad de donde rescatar la información caso de haberla liado.

    Un saludo

    • Marcado como respuesta TysonWB viernes, 16 de febrero de 2018 13:32
    viernes, 16 de febrero de 2018 6:19

Todas las respuestas

  • Hola TysonWB:

    y porque no extraer los datos, sin modificarlos.

    Te pongo un ejemplo con tus datos. He creado una tabla que se llama pruebas con el script que sigue:

    create table pruebas (id int identity(1,1) primary key,
    descripcion varchar(60));
    
    
    
    insert into pruebas values ('07 - Topografico');
    insert into pruebas values ('17 - Escritura inicial de la propiedad');
    insert into pruebas values ('05 - Grafica de asistencia');
    insert into pruebas values ('06 - Avaluos');
    insert into pruebas values ('07 - Fotografia');
    insert into pruebas values ('17 - Escritura inicial de la propiedad');
    insert into pruebas values ('07 - Estudio Legal');
    insert into pruebas values ('Carta de oferta');
    insert into pruebas values ('empleo');
    select * from pruebas
    
    select case (substring (descripcion,4,1)) when '-' then SUBSTRING(descripcion,6,len(descripcion)) else
    descripcion end as descripcion from pruebas 
    
    

    Como observarás a tenor de los resultados, te devuelve la select que va con el case, lo que solicitas.

    Si tienes que cambiar la columna por lo que sea, no es nada dificil, adaptar esa select a una update.

    Dado que indicas que tu nivel de sql es bajo, recuerda siempre, que las sentencias update, no tienen un volver a atrás por tanto, hay que asegurarse primero de que los cambios a realizar son al 100% correctos, aplicar la máxima de que cuando algo puede salir mal, saldrá y disponer de una copia de seguridad de donde rescatar la información caso de haberla liado.

    Un saludo

    • Marcado como respuesta TysonWB viernes, 16 de febrero de 2018 13:32
    viernes, 16 de febrero de 2018 6:19
  • Buenos días.

    Podrías probar la siguiente consulta, con el PATINDEX encuentras la primera coincidencia del carácter que elijas sino lo encuentra devuelve 0

    SELECT CASE PATINDEX('%-%', descripcion)
               WHEN 0 THEN
                   descripcion
               ELSE
                   LTRIM(RTRIM(SUBSTRING(descripcion, (PATINDEX('%-%', descripcion) + 1), LEN(descripcion))))
           END AS Resultado
     FROM mitabla as mt

    Espero te sirva de ayuda.

    Saludos.

    • Propuesto como respuesta HunchbackMVP viernes, 16 de febrero de 2018 13:19
    viernes, 16 de febrero de 2018 12:32
  • La idea es buscar si el patron existe y donde comienza para luego estirpar la cadena.

    SELECT
    	T0.col1,
    	CASE 
    	WHEN T1.col1 = 0 THEN T0.col1 
    	ELSE STUFF(T0.col1, 1, T1.col1 + 3, '') 
    	END AS col2
    FROM
    	(
    	VALUES
    		('07 - Topografico'),
    		('07 - Topografico'),
    		('17 - Escritura inicial de la propiedad'),
    		('05 - Grafica de asistencia'),
    		('06 - Avaluos'),
    		('07 - Fotografias'),
    		('17 - Escritura inicial de la propiedad'),
    		('09 - Estudio legal')
    	) AS T0(col1)
    	CROSS APPLY
    	(VALUES (PATINDEX('%[0-9] - %', T0.col1))) AS T1(col1);
    GO

    La funcion PATINDEX nos sirve para buscar el patron '%[0-9] - %' y si el patron existe pues podemos eliminar la subcadena desde la posicion 1 hasta la posicion indicada por PATINDEX mas 3 caracteres ' - '.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    viernes, 16 de febrero de 2018 13:22
  • Muchas gracias Javi Fernández F ME funciona a la perfección y gracias por el consejo lo pondre mucho en practica, te lo agradezco mucho. 
    viernes, 16 de febrero de 2018 13:33
  • @TysonWB - No hay de que.

    Ten en cuenta que el codigo escogido supone que el guion ' - ' siempre estara en la posicion 4 por lo que casos como '999 - blahblah' darian un resultado no esperado.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    viernes, 16 de febrero de 2018 14:55
  • Hola:

    Aunque Hunchback tiene toda la razón, del mismo modo que un patrón incorrecto daría el mismo resultado. Y es más difícil, pero...

    Departamento 1 - Oficina 3

    daría como resultado

    Oficina 3.

    Un saludo

    viernes, 16 de febrero de 2018 18:15