【问题标题】:SQL select statement with 3 conditions if there is null value in one condition the other conditions will fails?具有 3 个条件的 SQL 选择语句,如果一个条件中有空值,则其他条件将失败?
【发布时间】:2017-02-21 20:27:19
【问题描述】:

我有一个三列的表,第一列没有空值,但另外两列有空值查询没有给我我想要的结果,它保持忽略具有空值的字段:

SELECT 
    ISNULL(IQCRM_NUM, 0) AS ASIQCRM_NUM,
    ISNULL(Full_name, 0) AS ASFull_name,
    ISNULL(Mother_Name, 0) AS Mother_Name,
    ISNULL(Date_of_Birth, 0) AS Date_of_Birth,
    ISNULL(Province_of_birth, 0) AS Province_of_birth,
    ISNULL(Job, 0) AS Job 
FROM [Criminal Main Table] 
WHERE
    (Full_name LIKE N'%' + @Full_name + N'%' OR @Full_name IS NULL) AND (Mother_Name LIKE N'%' + @Mother_Name + N'%' OR @Mother_Name IS NULL) AND (Date_of_Birth LIKE N'%' + @Date_of_Birth + N'%' OR @Date_of_Birth IS NULL)

如果任何条件都符合,我希望查询从表中获取数据 像这样的空值

如果我输入 full_name like (ali) 我想获取类似的数据

full_name |Mother_Name |Date_of_Birth 
ali       | huda       |NULL
ali       |NULL        |1990
ali       |NULL        |NULL
ali       |Noor        |1988

【问题讨论】:

  • 你真正想要什么输出?当前的WHERE 子句对我来说似乎毫无意义。
  • 我希望在一个或两个或全部参数中输入文本来过滤数据并得到我想要的结果
  • 变量@Full_Name是参数之一吗?
  • @TimBiegeleisen 我想根据传递的参数过滤数据,直到列有空值我希望能够根据其他条件获取数据

标签: sql asp.net sql-server


【解决方案1】:

您需要正确构建LIKE 条件。变量应该出现在LIKE的谓词中:

WHERE (Full_name LIKE '%' + @Full_name + '%' OR Full_name IS NULL) AND
      (Mother_Name LIKE '%' + @Mother_Name + '%' OR Mother_Name IS NULL) AND
      (Date_of_Birth LIKE '%' + @Date_of_Birth + '%' OR Date_of_Birth IS NULL)

【讨论】:

  • Biegelesien 它给出错误连接函数需要两个参数?
  • 错误是什么?上面的 WHERE 子句对我来说看起来不错。
  • 我再试一次它给了我同样的错误 Msg 174, Level 15, State 1, Line 1 CONCAT 函数需要 2 个参数。
  • 你用的是什么版本的 MySQL?
  • 对不起兄弟,这是 SQL-Server
【解决方案2】:

试试这个,我猜你的问题是当你们中的一个参数具有有效值但其他参数不为空并且具有不在您的表中的值时,在这种情况下您的 WHERE ...AND 标准将永远不会为真

declare  @table table
(
    IQCRM_NUM int, 
    Full_name nvarchar(100),
    Mother_Name nvarchar(100), 
    Date_of_Birth varchar(20),
    Province_of_birth nvarchar(30),
    Job varchar(50)
)
insert into @table values
(1, 'Ali', 'Huda', '2000-01-01', 'aaa', 'Job')
,(2, 'Ali', null, '2000-01-01', 'aaa', 'Job')
,(3, null, null, '2000-01-01', 'aaa', 'Job')
,(4, null, 'Huda', '2000-01-01', 'aaa', 'Job')
,(5, 'Ali', 'Huda', '2000-01-01', 'aaa', 'Job')

Declare @Full_name nvarchar(100)='Ali'
Declare @Mother_Name nvarchar(100)=null
Declare @Date_of_Birth nvarchar(20)=null --'2000-01-02'

SELECT 
    ISNULL(IQCRM_NUM, 0) AS ASIQCRM_NUM,
    ISNULL(Full_name, '') AS ASFull_name,
    ISNULL(Mother_Name, '') AS Mother_Name,
    ISNULL(Date_of_Birth, '') AS Date_of_Birth,
    ISNULL(Province_of_birth, '') AS Province_of_birth,
    ISNULL(Job, '') AS Job 
FROM @table 
WHERE
    (Full_name LIKE '%'+@Full_name + '%' OR @Full_name IS NULL) 
AND (Mother_Name LIKE N'%' + @Mother_Name + N'%' OR @Mother_Name IS NULL) 
AND (Date_of_Birth LIKE N'%' + @Date_of_Birth + N'%' OR @Date_of_Birth IS NULL)

option(recompile)

【讨论】:

  • 这是动态查询,所以,你可以考虑使用选项 recompile 来使用你的索引。
猜你喜欢
  • 2015-06-07
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多