es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sentencia SQL – Cómo escribir una cláusula WHERE con comodín

Tengo una aplicación en C# que incluye una consulta SQL que incluye esta cláusula WHERE:

WHERE 
    A.Location = @Location
    AND Widgets.Branch = @Branch

Los requisitos han cambiado de manera que los usuarios puedan solicitar ver TODAS las sucursales. Sé que puedo escribir una sentencia if para verificar si se ha pasado un parámetro de sucursal… y luego tener una declaración select diferente que omita por completo la cláusula AND para la sucursal.

Pero me pregunto si hay una forma más sencilla de hacer esto. ¿Podría pasar algún tipo de comodín?

Intenté utilizar ‘*’ o ‘%’, pero esa no parece ser la sintaxis correcta. Sé que % se utiliza con LIKE…

Cualquier sugerencia/consejo sería apreciado.

EDIT 1

Estoy tratando de averiguar cómo utilizar el enfoque:

WHERE 
    A.Location = @Location
    AND (@Branch IS NULL OR Widgets.Branch = @Branch)

Mi código se ve así en parte:

using (var conn = new SqlConnection(connectionString))
{
   activityByUserType = conn.Query<ActivityDetailsByUserTypes>(
   @"
     SELECT 
         ReportRefreshDate,
         otras columnas...
     FROM 
         (SELECT
              columnas
          FROM table1 A
          INNER JOIN Widgets ON LOWER(fieldAA) = LOWER(A.fieldAA)
          WHERE 
              A.Location = @Location
              AND Widgets.Branch = @Branch) DetailedResults
      GROUP BY ReportRefreshDate;
   ",
   new { Branch=branchId, Location = LocationId, RefreshDate = dateRange}).ToList();
}
return activityByUserType;

Como puedes ver, estoy creando un nuevo objeto de consulta… y pasando una lista de parámetros al final del bloque de código.

Cambié la lógica para agregar esta sentencia if antes de USING():

if (branchId.Equals("allbranches")) 
{
   branchId = null;
}

Pero eso parece no funcionar realmente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para permitir que los usuarios vean todas las sucursales, puede modificar su consulta SQL para usar una declaración condicional en la cláusula WHERE que verifique si el parámetro @Branch es nulo. Si es nulo, la consulta devolverá todas las sucursales. Si no es nulo, la consulta solo devolverá resultados para la sucursal especificada.

    Aquí hay un ejemplo de cómo podría modificar su consulta:

    SELECT 
        columnas
    FROM tabla1 A
    INNER JOIN Widgets 
        ON LOWER(campoAA) = LOWER(A.campoAA)
    WHERE 
        A.Location = @Location
        AND (@Branch IS NULL OR Widgets.Branch = @Branch)
    

    En esta consulta modificada, el parámetro @Branch se utiliza en una declaración condicional que verifica si es nulo o no. Si es nulo (@Branch IS NULL), entonces la consulta devolverá todas las sucursales. Si no es nulo (Widgets.Branch = @Branch), entonces la consulta solo devolverá resultados para la sucursal especificada.

    Para utilizar este enfoque en su código C#, puede modificar su declaración using para incluir el parámetro @Branch y pasar null como valor del parámetro cuando desee ver todas las sucursales.

    Aquí hay un ejemplo de cómo podría modificar su código C#:

    using (var conn = new SqlConnection(connectionString))
    {
        if (branchId.Equals("allbranches")) 
        {
            branchId = null;
        }
    
        activityByUserType = conn.Query<detallesactividadportipousuario>(
            @"
            SELECT 
                ReportRefreshDate,
                otras columnas...
            FROM 
                (SELECT
                     columnas
                 FROM tabla1 A
                 INNER JOIN Widgets ON LOWER(campoAA) = LOWER(A.campoAA)
                 WHERE 
                     A.Location = @Location
                     AND (@Branch IS NULL OR Widgets.Branch = @Branch)) DetailedResults
             GROUP BY ReportRefreshDate;
            ",
            new { Branch = branchId, Location = LocationId, RefreshDate = dateRange }
        ).ToList();
    }
    
    return activityByUserType;
    

    En este código modificado, la variable branchId se establece en null si el usuario desea ver todas las sucursales (branchId.Equals("allbranches")). Luego, se ejecuta la consulta modificada utilizando el método conn.Query, pasando el parámetro Branch con el valor de branchId, así como los parámetros Location y RefreshDate.

    Este enfoque le permite utilizar una sola consulta para manejar ambos casos, sin necesidad de escribir consultas separadas o modificar la cláusula WHERE en su consulta.

Comments are closed.