SQL:Like';%'+;空+';%';-什么与此相匹配?

SQL:Like';%'+;空+';%';-什么与此相匹配?,sql,null,sql-like,Sql,Null,Sql Like,我有以下代码: where (object like (case when df.RuleType = 'Contains' then '%' + df.[Pattern A] + '%' end) And object like (case when df.RuleType = 'Contains' then '%' + df.[Pattern B] + '%' end) OR object in (case when df.RuleType = 'Equals' then df.[Patte

我有以下代码:

where (object like
(case when df.RuleType = 'Contains' then '%' + df.[Pattern A] + '%' end)
And object like
(case when df.RuleType = 'Contains' then '%' + df.[Pattern B] + '%' end)
OR object in (case when df.RuleType = 'Equals' then df.[Pattern A] end))
在某些情况下,输入“模式B”将为空。SQL将如何处理这个问题?我希望它的处理方式是,如果对象包含模式A,而模式B为null,那么where子句返回true(假设RuleType也包含)。如果RuleType等于,它只跳到OR位,如果对象与模式A完全相同,则返回True


然而,如果SQL以这种方式处理,我并没有得到我所期望的所有输出(有些应该返回TRUE的条目不是)

你可以这样处理

where ((df.[Pattern A] is NULL OR object like
(case when df.RuleType = 'Contains' then '%' + df.[Pattern A] + '%' end))
And (df.[Pattern B] is NULL OR object like
(case when df.RuleType = 'Contains' then '%' + df.[Pattern B] + '%' end))
OR df.[Pattern A] is NULL OR object in (case when df.RuleType = 'Equals' then df.[Pattern A] end))

需要一些优化

您可以这样处理

where ((df.[Pattern A] is NULL OR object like
(case when df.RuleType = 'Contains' then '%' + df.[Pattern A] + '%' end))
And (df.[Pattern B] is NULL OR object like
(case when df.RuleType = 'Contains' then '%' + df.[Pattern B] + '%' end))
OR df.[Pattern A] is NULL OR object in (case when df.RuleType = 'Equals' then df.[Pattern A] end))
(case when df.RuleType = 'Contains' then '%' + ISNULL(df.[Pattern A], object) + '%' end)
需要进行一些优化

(case when df.RuleType = 'Contains' then '%' + ISNULL(df.[Pattern A], object) + '%' end)
然而,这并不是一个特别好的方法——但我怀疑它会起作用,尽管正如前面所评论的那样,它会解决性能问题


然而,这并不是一个特别好的方法——但我怀疑它会起作用,尽管正如前面所评论的那样,它会解决性能问题。

比如“%something%”
首先是个坏主意。对全文索引进行一些研究,特别是当您使用sql server时。NULL将不匹配任何内容(包括另一个NULL)。NULL是一个未知值,未知的内容永远无法与其他未知内容匹配。(如果你能匹配他们,他们不可能是未知值,NULL是未知值。)想想看:从街上随机挑选两个人,让他们各自离开2分钟,然后右手拿着隐藏的东西回来,然后在不知道每个人隐藏了什么的情况下确定他们是否相同。你不能,因为一个可能拿着一枚硬币,另一个拿着一块石头(或者两枚硬币,或者两块石头)。平等性测试无法完成。@JoelCoehoorn从阅读几页来看,它的问题似乎在于查询时间(而我的查询运行时间相当长,而且是一次性的)。这是真的还是我遗漏了一些会影响结果的东西?如果你现在的表现很好,而且这种情况正在消失,那就没关系了。像“%something”这样的
的问题是,普通索引根本不起作用,而且您必须对可能较大的值进行完整的表扫描。随着数据的增长,在数据库中几乎没有什么可以更快地降低性能。
比如“%something%”
首先是个坏主意。对全文索引进行一些研究,特别是当您使用sql server时。NULL将不匹配任何内容(包括另一个NULL)。NULL是一个未知值,未知的内容永远无法与其他未知内容匹配。(如果你能匹配他们,他们不可能是未知值,NULL是未知值。)想想看:从街上随机挑选两个人,让他们各自离开2分钟,然后右手拿着隐藏的东西回来,然后在不知道每个人隐藏了什么的情况下确定他们是否相同。你不能,因为一个可能拿着一枚硬币,另一个拿着一块石头(或者两枚硬币,或者两块石头)。平等性测试无法完成。@JoelCoehoorn从阅读几页来看,它的问题似乎在于查询时间(而我的查询运行时间相当长,而且是一次性的)。这是真的还是我遗漏了一些会影响结果的东西?如果你现在的表现很好,而且这种情况正在消失,那就没关系了。像“%something”
这样的
的问题是,普通索引根本不起作用,而且您必须对可能较大的值进行完整的表扫描。事实上,在数据库中,随着数据的增长,没有什么能更快地降低性能。