相关疑难解决方法(0)

像'%'不接受NULL值

我有从用户输入构建的查询(通过html表单传递).它看起来像(简单的例子):

Select * From [table] Where [table].[column] like '<parameter>'
Run Code Online (Sandbox Code Playgroud)

此参数可以是可选的,因此如果用户将相应的输入字段留空,则传递%.它工作正常,直到我遇到NULL值.我理解'%'匹配的符号不是null,但我想在这种情况下将NULL视为空字符串.

我该怎么办?当用户离开空输入时,更改查询(如何?)或传递另一个符号?

谢谢.

PS.这是现有系统的真正问题,我知道它远非最佳解决方案,但我必须处理它.

sql null

24
推荐指数
2
解决办法
5万
查看次数

与参数一起使用时如何优化"OR"子句的使用(SQL Server 2008)

我想知道是否有任何明智的方法来重写以下查询,以便优化器使用列上的索引?

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

现在我的问题是,如果可能的组合只有三到四个,我们该怎么办?为每个组合编写单独的查询似乎不是一个合理的解决方案.这个问题还有其他解决方法吗?

sql-server indexing performance clause

8
推荐指数
2
解决办法
1万
查看次数

SQL'%'外卡字符是否捕获空值?

最近我遇到了一个查询问题,该问题没有返回它预期返回的所有内容.按条件选择的部分查询如下:

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并不像那样工作,但这基本上就是我想要实现的目标.

谢谢大家,如果这是重复,我很抱歉,我找不到答案.

sql sql-server

3
推荐指数
1
解决办法
139
查看次数

标签 统计

sql ×2

sql-server ×2

clause ×1

indexing ×1

null ×1

performance ×1