none
Extraer caracteres con Condicion RRS feed

  • Pregunta

  • Buenas tardes, una consulta como puedo extraer caracteres de un registro con una condición por ejemplo;

    F10.186-BLA-L eso es un código, en la cual yo quiero extraer todos los caracteres antes que llegue al guion, el resultado deberia ser esto F10.186, osea si detecta el guion ahi debe de parar.


    martes, 28 de febrero de 2017 22:37

Respuestas

Todas las respuestas

  • Oscar Perez 1234,

    Es un ejercicio simple basado en recuperar una sub-cadena basado en un marcador:

    DECLARE @Texto varchar(100) = 'F10.186-BLA-L';
    SELECT SUBSTRING(@Texto, 0, CHARINDEX('-', @Texto));
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 28 de febrero de 2017 22:50
  • También te sirve la función LEFT

    SELECT LEFT(@Texto, CHARINDEX('-', @Texto) - 1);


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 28 de febrero de 2017 22:52
  • Ya Willams te dio una respuesta valida, solo quiero agregar que para hacer el codigo mas legible al tratar de detectar el guion, uses el operador APPLY para hacer el calculo y luego podras indagar sobre esta en futuras operaciones.

    SELECT 
    	T1.col1, 
    	CASE WHEN T2.pos_primer_guion = 0 THEN T1.col1 ELSE SUBSTRING(T1.col1, 0, T2.pos_primer_guion) END AS col2
    FROM
    	(VALUES ('F10.186-BLA-L'), ('F10.187')) AS T1(col1)
    	CROSS APPLY
    	(SELECT CHARINDEX('-', col1)) AS T2(pos_primer_guion);
    GO


    AMB

    Some guidelines for posting questions...

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


    miércoles, 1 de marzo de 2017 13:37
  • Si se busca legibilidad pienso que se puede abstraer incluso las reglas de validación de posición, por ejemplo:

    SELECT 
    	T1.col1, 
    	SUBSTRING(T1.col1, 0, T2.posicion) AS col2
    FROM
    	(VALUES ('F10.186-BLA-L'), ('F10.187')) AS T1(col1)
    	CROSS APPLY
    	(SELECT COALESCE(NULLIF(CHARINDEX('-', col1), 0), LEN(col1) + 1)) AS T2(posicion);
    GO

    La consulta externa debería consumir un dato simple, validado.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 1 de marzo de 2017 15:07
  • De acuerdo Willams, solo que una llamada mas a una funcion que no es necesario en este caso (para ser preciso dos llamadas una a LEN y otra a SUBSTRING cuando no existe el guion y se requiere el mismo valor).

    AMB

    Some guidelines for posting questions...

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


    miércoles, 1 de marzo de 2017 15:12
  • Diferencia de tiempo despreciable vs legibilidad, voy por lo segundo. Claro, es un escenario muy simple para ponernos extremistas.
    miércoles, 1 de marzo de 2017 15:16
  • De acuerdo, pero cuando me referi a legibilidad era sobre indagar sobre el valor en la misma expresion.

    substring(col1, 1, case when charindex(...) = 0 then LEN(...) else charindex(...) end)

    Siempre que hay una expresion CASE (traduccion del COALESCE) que llama a una funcion para indagar y en uno de los afluentes se le llama nuevamente a la funcion, terminamos llamando a esta dos veces.

    Parece algo trivial pero puede causar problemas de desempenio cuando esa funcion es cara, similar cuando usamos un query en vez de la funcion.

    Eso lo podemos ver en como esta funcion se traduce al motor.

    [Expr1004] = Scalar Operator(substring([Union1002],(1),CASE WHEN CASE WHEN (charindex('-',[Union1002])-(1))=(-1) THEN NULL ELSE charindex('-',[Union1002])-(1) END IS NOT NULL THEN CASE WHEN (charindex('-',[Union1002])-(1))=(-1) THEN NULL ELSE charindex('-',[Union1002])-(1) END ELSE len([Union1002]) END))

    Yo se que para muchos de los que compartimos en este grupo no es gran cosa, pero si para quienes comienzan con este lenguaje.


    AMB

    Some guidelines for posting questions...

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

    miércoles, 1 de marzo de 2017 15:36
  • El objetivo de abstraer un bloque de código es reutilizar su funcionalidad y en ese sentido las ganancias son evidentes si utilizamos el código "encapsulado" en varias partes de la consulta de selección, en ese caso si que es necesario -en aras de la legibilidad- hacer uso de un valor simple y evitarnos las múltiples instrucciones CASE, pero si la consulta se basa en la descomposición por única vez de la columna en mención entonces incluso el uso de CROSS APPLY termina estorbando, sigo insistiendo en que posiblemente estamos siendo extremistas en un escenario bastante trivial.

    miércoles, 1 de marzo de 2017 16:45