Sql server 根据不同参数筛选SQL datatable,不带WHERE子句
我正在构建一个应用程序,它需要允许用户根据不同的过滤器过滤数据表。因此,用户将有三个不同的过滤器posibilite,但他可能只使用一个,或两个或三个在同一个tame 那么,假设我在表中有以下列: ID(int)PK Sede(内部) 程序A(int) 埃斯塔多(国际) 所有这些列都将存储数字、整数。“ID”列是主键,“Sede”存储1或2,“Programa”是介于1和15之间的任何数字,“Estado”将存储介于1和13之间的数字 用户可以使用任何过滤器(Sede、Programa或Estado)过滤存储在表中的数据。但是,也可以使用两个过滤器,或者同时使用三个过滤器 这个应用程序的工作原理与Excel上的数据过滤器类似。我在excel上创建了一个模拟表格,以显示我想要实现的目标: 第一幅图显示了整个表,没有应用任何过滤器 在这里,用户为“Sede”和“Programa”选择了一个过滤器,但将“Estado”过滤器留空。因此,查询返回与筛选器相等的值,但保持“Estado”筛选器打开,并带来所有记录,仅通过“Sede”(1)和“Programa”(6)进行归档 在这幅图中,用户只选择了“Estado”过滤器(5),因此它会带来所有符合此条件的记录,不管“Sede”或“Programa”是否为空 如果我使用带有WHERE的SELECT clasuse,它将起作用,但前提是三个过滤器都有一个值:Sql server 根据不同参数筛选SQL datatable,不带WHERE子句,sql-server,select,filter,Sql Server,Select,Filter,我正在构建一个应用程序,它需要允许用户根据不同的过滤器过滤数据表。因此,用户将有三个不同的过滤器posibilite,但他可能只使用一个,或两个或三个在同一个tame 那么,假设我在表中有以下列: ID(int)PK Sede(内部) 程序A(int) 埃斯塔多(国际) 所有这些列都将存储数字、整数。“ID”列是主键,“Sede”存储1或2,“Programa”是介于1和15之间的任何数字,“Estado”将存储介于1和13之间的数字 用户可以使用任何过滤器(Sede、Programa或Esta
DECLARE @sede int
DECLARE @programa int
DECLARE @estado int
SET @sede = '1'
SET @programa = '5'
SET @estado = '12'
SELECT * FROM [dbo].[Inscripciones]
WHERE
([dbo].[Inscripciones].[Sede] = @sede)
AND
([dbo].[Inscripciones].[Programa] = @programa)
AND
([dbo].[Inscripciones].[Estado] = @estado)
我也试着把“AND”改成“OR”,但没有达到预期的效果
我们将非常感谢您的帮助!!谢谢 常见问题:尝试在变量上使用coalesce,对于第二个值,使用要比较的字段名。不过要小心;确保传递的是
NULL
而不是空字符串
这样做的目的是获取传入变量的第一个非空值或您要比较的值。。因此,如果传入的值为null,则比较将始终返回true
WHERE
[dbo].[Inscripciones].[Sede] = coalesce(@sede, [dbo].[Inscripciones].[Sede])
AND
[dbo].[Inscripciones].[Programa] = coalesce(@programa, [dbo].[Inscripciones].[Programa])
AND
[dbo].[Inscripciones].[Estado] = coalesce(@estado, [dbo].[Inscripciones].[Estado])
如果sede为null,并且programa和estado已填充,则比较将如下所示
?=? (or 1=1)
?=programa variable passed in
?=Estado variable passed in
博阿分拣机 常见问题:尝试在变量上使用coalesce,对于第二个值,使用要比较的字段名。不过要小心;确保传递的是
NULL
而不是空字符串
这样做的目的是获取传入变量的第一个非空值或您要比较的值。。因此,如果传入的值为null,则比较将始终返回true
WHERE
[dbo].[Inscripciones].[Sede] = coalesce(@sede, [dbo].[Inscripciones].[Sede])
AND
[dbo].[Inscripciones].[Programa] = coalesce(@programa, [dbo].[Inscripciones].[Programa])
AND
[dbo].[Inscripciones].[Estado] = coalesce(@estado, [dbo].[Inscripciones].[Estado])
如果sede为null,并且programa和estado已填充,则比较将如下所示
?=? (or 1=1)
?=programa variable passed in
?=Estado variable passed in
博阿分拣机 谢谢大家的回答。在阅读了@SeanLange在评论中发布的文章后,我终于能够实现所需的目标。在WHERE语句中使用CASE子句解决交易。代码如下:
SELECT
*
FROM [dbo].[Inscripciones]
WHERE
([dbo].[Inscripciones].[Sede] = (CASE WHEN @sede = '' THEN [dbo].[Inscripciones].[Sede] ELSE @sede END))
AND
([dbo].[Inscripciones].[Programa] = (CASE WHEN @programa = '' THEN [dbo].[Inscripciones].[Programa] ELSE @programa END))
AND
([dbo].[Inscripciones].[Estado] = (CASE WHEN @estado = '' THEN [dbo].[Inscripciones].[Estado] ELSE @estado END))
AND
([dbo].[Inscripciones].[TipoIngreso] = (CASE WHEN @tipoingreso = '' THEN [dbo].[Inscripciones].[TipoIngreso] ELSE @tipoingreso END))
再次感谢 谢谢大家的回答。在阅读了@SeanLange在评论中发布的文章后,我终于能够实现所需的目标。在WHERE语句中使用CASE子句解决交易。代码如下:
SELECT
*
FROM [dbo].[Inscripciones]
WHERE
([dbo].[Inscripciones].[Sede] = (CASE WHEN @sede = '' THEN [dbo].[Inscripciones].[Sede] ELSE @sede END))
AND
([dbo].[Inscripciones].[Programa] = (CASE WHEN @programa = '' THEN [dbo].[Inscripciones].[Programa] ELSE @programa END))
AND
([dbo].[Inscripciones].[Estado] = (CASE WHEN @estado = '' THEN [dbo].[Inscripciones].[Estado] ELSE @estado END))
AND
([dbo].[Inscripciones].[TipoIngreso] = (CASE WHEN @tipoingreso = '' THEN [dbo].[Inscripciones].[TipoIngreso] ELSE @tipoingreso END))
再次感谢 简单的方法是使用一个case,检查sede、programma或estado是否为空,如果为空,则在or子句中使用它,并且非空字段应在中,并且clausenext idea从服务器端进行自我验证,您知道表列名,因此从服务器端传递where子句并在此处使用动态sql,因此,仅在where子句中包含非空字段,从sql你也可以做同样的事情唯一的一件事就是你必须使用动态sql来解决这个问题简单的方法就是使用一个case,检查sede、programma或estado是否为空,如果为空,则在or子句中使用它,非空字段应该为,从服务器端it本身来看,clausenext idea可以验证它,您知道表的列名,因此从服务器端传递where子句,并在此处使用动态sql,因此只在where子句中包含非空字段,从sql你也可以做同样的事情,唯一的一件事是你必须使用动态sql,这是值得添加一个链接到这篇文章,其中讨论了这种类型的捕获所有查询非常详细,以及一些方法来处理最终的性能问题。伟大的文章@SeanLange。这篇文章对这种方法对更大数据的性能副作用做出了更全面的回应。@SeanLange谢谢!这篇文章为我提供了解决这个问题的所有线索。值得在这篇文章中添加一个链接,详细讨论这种类型的“一网打尽”查询,以及一些处理这种查询最终性能问题的方法。伟大的文章@SeanLange。这篇文章对这种方法对更大数据的性能副作用做出了更全面的回应。@SeanLange谢谢!那篇文章给了我解决这个问题的所有线索。