我有从用户输入构建的查询(通过html表单传递).它看起来像(简单的例子):
Select * From [table] Where [table].[column] like '<parameter>'
Run Code Online (Sandbox Code Playgroud)
此参数可以是可选的,因此如果用户将相应的输入字段留空,则传递%.它工作正常,直到我遇到NULL值.我理解'%'匹配的符号不是null,但我想在这种情况下将NULL视为空字符串.
我该怎么办?当用户离开空输入时,更改查询(如何?)或传递另一个符号?
谢谢.
PS.这是现有系统的真正问题,我知道它远非最佳解决方案,但我必须处理它.
我想知道是否有任何明智的方法来重写以下查询,以便优化器使用列上的索引?
Create Procedure select_Proc1
@Key1 int=0,
@Key2 int=0
As
BEGIN
Select key3
From Or_Table
Where (@key1 =0 OR Key1 =@Key1) AND
(@key2 =0 OR Key2 =@Key2)
END
GO
Run Code Online (Sandbox Code Playgroud)
即使WHERE子句中的列被索引覆盖,SQL Server也无法使用这些索引.这提出了一个问题,即是否有任何东西"阻止"索引的使用.这个问题的答案是肯定的 - 罪魁祸首是参数和"或"条件.索引不包含这些参数,这意味着SQL Server无法使用任何索引来评估"@ key1 = 0"(同样适用于@ key2 = 0的条件).实际上,这意味着SQL Server无法使用索引来评估子句"@ key1 = 0 OR Key1 = @ key1"(因为"OR"子句是两个条件所涵盖的行的并集).同样的原则也适用于其他条款(re.key2).这导致SQL Server得出结论,没有索引可用于提取行,使SQL Server能够利用下一个最佳方法 - 聚簇索引扫描
如您所见,如果WHERE子句中的谓词为"OR",则SQL优化器将不使用列上的索引.针对此问题的一种解决方案是使用IF子句为所有可能的参数组合分隔查询.
请阅读这篇简短的文章,以便更好地了解问题:http://www.sql-server-performance.com/articles/per/optimize_or_clause_p1.aspx
现在我的问题是,如果可能的组合只有三到四个,我们该怎么办?为每个组合编写单独的查询似乎不是一个合理的解决方案.这个问题还有其他解决方法吗?
最近我遇到了一个查询问题,该问题没有返回它预期返回的所有内容.按条件选择的部分查询如下:
AND field LIKE
CASE WHEN @val = 1 THEN
'%'
ELSE
'N'
END
Run Code Online (Sandbox Code Playgroud)
现在,当@val为1时,我希望这段代码基本上什么也不做,就像基本上接受任何值的条件一样,包括空值.
我错了吗?如果是这样,有没有人有解决方案?我正在思考一些事情
AND field LIKE
CASE WHEN @val = 1 THEN
'%' OR ISNULL(field)
ELSE
'N'
END
Run Code Online (Sandbox Code Playgroud)
但是SQL并不像那样工作,但这基本上就是我想要实现的目标.
谢谢大家,如果这是重复,我很抱歉,我找不到答案.