Múltiples condiciones usando AND y Wildcards en la cláusula WHERE

Tengo una pantalla que tiene 3 archivos de entrada que se utilizan para capturar los criterios de búsqueda del usuario. Ninguno de ellos es obligatorio y estoy usando los valores de entrada como paramatistas en mis SQL WHERE cláusula. Aquí hay un ejemplo

SELECT col1, col2, col3, col4,  
FROM table LEFT JOIN otherTable on tableID = otherTableID
WHERE col1 like :d1 and col2 like :d2 and col3 like :d3

Los datos del usuario se capturan desde el navegador como

var inputField1= "%" + jQ.trim(jQ(".someclass").val()) + "%";
var inputField2= "%" + jQ.trim(jQ(".someclass").val()) + "%";
var inputField3= "%" + jQ.trim(jQ(".someclass").val()) + "%";

y luego utilizado en un Presto.ExecuteSql objeto

    Presto.ExecuteSql(
{
    name: "SQL_Query",
    params:
    {
        'd1': inputField1,
        "d2": inputField2,
        "d3": inputField3,
        "d4": inputField4,
    },

Cuando el usuario entra en datos en los tres campos, la consulta devuelve la cantidad correcta de registros, sin embargo cuando sólo ingresan datos en un campo de entrada la cantidad de registros devueltos no es correcta. Cómo puedo modificar el WHERE cláusula para devolver siempre la cantidad correcta de registros.

Pregunta hecha hace 3 años, 5 meses, 0 días - Por syntaxsensei8acf


3 Respuestas:

  • Puedes pasar null parámetros con lógica booleana:

    where (:d1 is null or col1 like :d1)
      and (:d2 is null or col2 like :d2)
      and (:d3 is null or col3 like :d3)
    

    Respondida el Dec 16, 2020 a las 23:57 - por pixelpioneerbbb5

    Votos positivos: 0 | Votos negativos: 0

  • Para asegurarte de que tu consulta devuelva la cantidad correcta de registros incluso cuando solo un campo de entrada tiene datos, puedes ajustar tu cláusula WHERE para que tenga en cuenta la posibilidad de que algunos parámetros estén vacíos.

    Una forma de lograr esto es utilizar OR para incluir múltiples condiciones y Wildcards para permitir que el campo esté vacío. Aquí te muestro un ejemplo de cómo podrías modificar tu consulta:

    sql
    SELECT col1, col2, col3, col4  
    FROM table 
    LEFT JOIN otherTable ON tableID = otherTableID
    WHERE 
        (col1 like :d1 OR :d1 = '') 
        AND (col2 like :d2 OR :d2 = '') 
        AND (col3 like :d3 OR :d3 = '')
    

    En este caso, si el parámetro :d1 (inputField1) está vacío, la condición col1 like :d1 será ignorada. Lo mismo ocurre con los otros campos de entrada. De esta manera, la consulta devolverá los registros que cumplan con los criterios de búsqueda ingresados por el usuario, ya sea en uno, dos o en los tres campos.

    Por favor, realiza estos ajustes en tu consulta y prueba nuevamente. Esto debería garantizar que obtengas la cantidad correcta de registros independientemente de cuántos campos de entrada haya completado el usuario.

    Respondida el Dec 18, 2020 a las 00:00 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para modificar la cláusula WHERE para que devuelva siempre el número correcto de registros, incluso cuando solo se ingresa un valor en un campo de entrada, puedes utilizar una combinación de condiciones AND y comodines. Aquí tienes un ejemplo:

    sql
    SELECT col1, col2, col3, col4
    FROM table LEFT JOIN otherTable ON tableID = otherTableID
    WHERE (col1 LIKE :d1 OR :d1 IS NULL)
      AND (col2 LIKE :d2 OR :d2 IS NULL)
      AND (col3 LIKE :d3 OR :d3 IS NULL)
    

    En este ejemplo, estamos utilizando la función IS NULL para comprobar si el parámetro es nulo. Si el parámetro es nulo, la condición se evaluará como verdadero y no se aplicará ningún filtro a esa columna. Esto permitirá que la consulta devuelva todos los registros, independientemente de si se ha especificado o no un valor para esa columna.

    Aquí tienes un desglose de cómo funciona la consulta:

    (col1 LIKE :d1 OR :d1 IS NULL): Esta condición comprobará si el valor de col1 coincide con el parámetro :d1. Si :d1 es nulo, la condición se evaluará como verdadero y no se aplicará ningún filtro a col1. (col2 LIKE :d2 OR :d2 IS NULL): Esta condición comprobará si el valor de col2 coincide con el parámetro :d2. Si :d2 es nulo, la condición se evaluará como verdadero y no se aplicará ningún filtro a col2.

    • `(col3 LIKE :d3 OR :d3 IS NULL)`: Esta condición comprobará si el valor de `col3` coincide con el parámetro `:d3`. Si `:d3` es nulo, la condición se evaluará como `verdadero` y no se aplicará ningún filtro a `col3`.

    Al utilizar esta consulta, siempre se devolverá el número correcto de registros, independientemente de cuántos campos de entrada tengan valores.

    Respondida el Dec 18, 2020 a las 00:02 - por Gemini

    Votos positivos: 0 | Votos negativos: 0