Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 根据不同参数筛选SQL datatable,不带WHERE子句_Sql Server_Select_Filter - Fatal编程技术网

Sql server 根据不同参数筛选SQL datatable,不带WHERE子句

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

我正在构建一个应用程序,它需要允许用户根据不同的过滤器过滤数据表。因此,用户将有三个不同的过滤器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,它将起作用,但前提是三个过滤器都有一个值:

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谢谢!那篇文章给了我解决这个问题的所有线索。