Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 在同一个表中有两个字段的数据库查询。Don';不要考虑任何值是否为空。_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql 在同一个表中有两个字段的数据库查询。Don';不要考虑任何值是否为空。

Sql 在同一个表中有两个字段的数据库查询。Don';不要考虑任何值是否为空。,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,问题是我有一个4列的表。我有两个搜索框 田地 FName LName Age School 文本框 FName School 如果用户插入了两个值,我希望使用这两个值获得相交。如果只有一个值存在,我希望有使用该值的数据。我想不在应用程序中处理这个问题,而是使用存储过程。 我考虑在存储过程中使用IF-ELSE或进行子查询。但不是固溶体。我需要一些指导来想出一个可能的方法。先谢谢你 这是我试过的。这正是我需要将其嵌入到存储过程中的查询 SELECT * FROM STUDENT WHERE FN

问题是我有一个4列的表。我有两个搜索框

田地

FName
LName
Age
School
文本框

FName
School
如果用户插入了两个值,我希望使用这两个值获得相交。如果只有一个值存在,我希望有使用该值的数据。我想不在应用程序中处理这个问题,而是使用存储过程。 我考虑在存储过程中使用IF-ELSE或进行子查询。但不是固溶体。我需要一些指导来想出一个可能的方法。先谢谢你

这是我试过的。这正是我需要将其嵌入到存储过程中的查询

SELECT * FROM STUDENT WHERE FNname like '%TestFName%' 
INTERSECT SELECT * FROM STUDENT WHERE School LIKE '%TestSchool';
如果“TestSchool”变为null,则会获取第一个查询中的所有记录

如果两个值都丢失,则返回整个表


如果两个值都存在,它将返回特定的数据元组。

以下是我针对自己的问题得出的答案

 SELECT *
 FROM YourTable
 WHERE (FName = @Fname OR @Fname = '') 
   AND (School = @School OR @School ='')
SELECT * FROM STUDENT WHERE FNname like '%TestFName%' 
INTERSECT SELECT * FROM STUDENT WHERE School LIKE '%TestSchool';
在这里,如果“TestFName”变为null,它将获取第二个查询中的所有记录

如果“TestSchool”变为null,则会获取第一个查询中的所有记录

如果两个值都丢失,则返回整个表

如果两个值都存在,则返回特定的数据元组

 SELECT *
 FROM YourTable
 WHERE (FName = @Fname OR @Fname = '') 
   AND (School = @School OR @School ='')

谢谢。如果有比这更好的方法,请告诉我们。

很确定它就这么简单

SELECT * 
FROM STUDENT 
WHERE FNname like '%TestFName%'
    AND School LIKE '%TestSchool%';
如果使用“AND”而不是“OR”,则它满足所有给定条件

您可以使用:

SELECT * FROM STUDENT WHERE isnull(FNname, '') like '%' + isnull(@FNname, '') + '%' 
and isnull(School, '') like '%' + isnull(@School, '') + '%'

在您的存储过程中使用参数
@FNname
@School
,并在其中使用上述查询。

首先,MySQL还是SQL Server?哪一个?第二,您尝试了什么?为什么要在此处使用INTERSECT?您的老师是否要求您必须使用该关键字?还有……哪些DBMS?答案不一样。我的问题是r SQL Server。但我想知道两者的解决方案。我已经更新了我的问题。不。我不知道其他方法。请指导我,如果有你看到下面的答案,来自Juan Carlos Oropeza???如果你想要这些行中的任何一个都是正确的,只需将AND更改为OR。首先,前导通配符对性能非常有害rmance。如果可能的话,你应该避免这一点。其次,当你只需要一个查询时,你正在运行两个查询。是的,我认为这些是问题。因为它是一个搜索框,而不是UI中的下拉列表,所以我需要通配符。是的,如果有办法避免这两个查询,那么最好是Ry Sean回答,你只需要一个查询。我的查询是在你发布之前的类似的例子包括:(我们知道领先的Wildard非常糟糕,但是像“%TestFName%”这样的
fName或TestFName='
会比像“%TestFName%”这样的
fName表现得更好。
?可能差不多。第一个谓词会破坏性能。要检查的谓词“”不会影响性能。它不满足此条件”如果两个值都存在,则返回特定的数据元组。"更改
您有一些非常具体的要求,但没有很好地发布您期望的输出。有几个人对未知的表结构和未知的期望输出给出了可能的答案。如果您需要详细的帮助,您需要提供这些表结构的详细信息,sample数据,根据示例数据给定一组参数所需的输出。我认为您理解错误。可以为null的是参数,而不是dbI上的字段。我不这样认为。通常,两列都可能包含
null
,在这种情况下,如果
@School
为空,则他需要此列的所有记录,如果我们不要使用
isnull(学校,”)
NULL
记录将被排除。