none
CONSULTA SQL CON CONDICION DOBLE Y UNO DE LOS CAMPO ESTA VACIO RRS feed

  • Pregunta

  • Hola, buenos días para unos, buenas tardes para otros y buenas noches para el resto. Tengo el siguiente código:

    Private Sub f_consultar_id_transportista() Using cn As New SqlConnection("Data Source =" & str_Server_name & ";Initial Catalog=" & str_data_base & ";User id =" & str_user & ";Password =" & str_password & ";MultipleActiveResultSets=True") cn.Open() Dim SQL As New SqlCommand("SELECT int_Id_Persona,str_Nombre,str_Apellido FROM tbl_cia_Personas " & _ "WHERE str_Nombre + ' ' + str_Apellido='" & Me.cmb_Transporte.Text & "'", cn) Dim leerSQL As SqlDataReader leerSQL = SQL.ExecuteReader If leerSQL.Read Then Me.lbl_Id_Transporte.Text = leerSQL("int_Id_Persona") End If End Using End Sub

    El nombre del transporte de guarda en una tabla que tambien almacena información de una persona común con nombre y apellido, resulta que el nombre de este transporte no ocupa la columna apellido solo la columna nombre mi consulta sql concatena la condicion where en nombre y apellido los cuales se muestran en un combobox ya que tambien puede ser persona que abarquen las dos columnas, mi duda es como hace para que mi consulta sql ubique la información utilizando las columnas nombres y apellido aun cuando la columna apellido esta en NULL.

    Como se los muestro en el codigo no me trae información cuando la columna apellido esta vacia.

    Se que puedo utilizar solo la columna nombre en este caso pero repito hay transportes que abarcan las columnas nombre y apellido y hay transportes que solo abarcan la columna nombre.

    Gracias de antemano


    ANGEL GIL

    viernes, 18 de agosto de 2017 14:15

Respuestas

  • Puedes poner algo similar a esto:

    "WHERE str_Nombre+COALESCE(' ' + str_Apellido, '') = '" & Me.cmb_Transporte.Text & "'"

    El COALESCE hace que si el apellido es NULL se convierta a una cadena vacía, por lo que al concatenarlo con el nombre quedara solo el nombre, y el resultado se comparara correctamente con el cmb_Transporte.Text suponiendo que solo contenga el nombre (sin un espacio en blanco al final).

    Ojo con las inyecciones de SQL, cerciórate de que el cmb_Transporte no puede contener datos tecleados por el usuario, o bien parametriza la sentencia en lugar de concatenar el text.

    viernes, 18 de agosto de 2017 14:23
  • El problema se presenta cuando se intenta concatenar NULL a un valor NOT NULL, el resultado será NULL (a menos que tengas la directiva CONCAT_NULL_YIELDS_NULL configurado en OFF, creo ya en desuso) por lo que la comparación será resuelta como FALSE y en consecuencia no tendrás los resultados esperados.

    Adicional a lo propuesto por Alberto podrías utilizar la función CONCAT() que evita resolver una concatenación como NULL, aún cuando uno de sus argumentos sea NULL.

    WHERE CONCAT(str_Nombre, ' ', str_Apellido) = @Valor


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    viernes, 18 de agosto de 2017 16:54

Todas las respuestas

  • Puedes poner algo similar a esto:

    "WHERE str_Nombre+COALESCE(' ' + str_Apellido, '') = '" & Me.cmb_Transporte.Text & "'"

    El COALESCE hace que si el apellido es NULL se convierta a una cadena vacía, por lo que al concatenarlo con el nombre quedara solo el nombre, y el resultado se comparara correctamente con el cmb_Transporte.Text suponiendo que solo contenga el nombre (sin un espacio en blanco al final).

    Ojo con las inyecciones de SQL, cerciórate de que el cmb_Transporte no puede contener datos tecleados por el usuario, o bien parametriza la sentencia en lugar de concatenar el text.

    viernes, 18 de agosto de 2017 14:23
  • El problema se presenta cuando se intenta concatenar NULL a un valor NOT NULL, el resultado será NULL (a menos que tengas la directiva CONCAT_NULL_YIELDS_NULL configurado en OFF, creo ya en desuso) por lo que la comparación será resuelta como FALSE y en consecuencia no tendrás los resultados esperados.

    Adicional a lo propuesto por Alberto podrías utilizar la función CONCAT() que evita resolver una concatenación como NULL, aún cuando uno de sus argumentos sea NULL.

    WHERE CONCAT(str_Nombre, ' ', str_Apellido) = @Valor


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    viernes, 18 de agosto de 2017 16:54
  • Gracias amigo mío me sirvió al 100 %, no había tenido tiempo de probar y marcarlo como respuesta pero me solucionó el problema. Gracias

    ANGEL GIL

    lunes, 21 de agosto de 2017 12:29