【问题标题】:Managing SQL scripts with arguments使用参数管理 SQL 脚本
【发布时间】:2015-09-23 13:23:31
【问题描述】:

我保留了许多与工作相关的 SQL 便利脚本。 有一段时间我一直在使用一个约定 我可以激活的 where 语句中的几个 AND 子句 通过提供一个或多个值进行搜索。例如,

where color like '%&color' and size like '%&size'

当我在首选客户端 (Golden6) 中运行此类 SQL 时,它会弹出 一个对话框,我可以在其中提供颜色、大小或两者的值。 很方便,但是 LIKE '%string' 的表现往往 很糟糕,通常会导致全表扫描,或者我已经读过。

是否有一些替代技术来编写和管理这些 保持能够仅填写的便利的脚本 我想使用的参数,但避免了 LIKE '%string' 周围的性能问题?我不想每次使用时都编辑脚本, 因为我将它们保存在 git 中,并且我不想总是管理一堆本地修改的文件来整理。

【问题讨论】:

  • 好吧,我想问题是,你真的需要LIKE吗?您是在搜索您知道存在的确切值,还是您真的想要与您搜索的值相似的任何东西?如果你真的需要使用LIKE '%...',那么全表扫描是不可避免的(它会因为前导通配符而进行全表扫描,这使得索引无法使用)。
  • 我使用 LIKE 只是作为一种技巧,所以如果我(例如)不提供颜色值,而只提供大小,那么空颜色子句不会阻止任何事情从匹配 where 条件。
  • 您可以随时将AND 更改为OR 来解决此问题,而不是使用LIKE
  • 请参阅this post 了解您可以尝试的方法。

标签: sql oracle git


【解决方案1】:

如果你想支持可选的输入参数,那么你可以试试

with data as 
(select '123' col1, 'ABC' col2 from dual union select '124', 'AB' from     dual)
select * from  data a where a.col1 = nvl('&col1', a.col1) and a.col2 = nvl('&col2', a.col2)

具有空值的附加数据行

with data as
 (select '123' col1, 'ABC' col2
from dual
  union
  select '124', 'AB'
    from dual
  union
  select '123', null from dual
  union
  select '124', null from dual)
select *
  from data
 where ('&col1' is null or '&col1' is not null and '&col1' = col1)
 and ('&col2' is null or '&col2' is not null and '&col2' = col2)

【讨论】:

  • 我不得不调整这个答案以获得我想要的行为。在 Oracle 上进行实验,如果值为 null,则“值 = 值”条件似乎为假。这意味着我必须对每个可选输入参数说 and (size is null or size = nvl('&size', size))
  • 实际上这也不起作用:现在应用该技术时,我得到的值要么与请求的值匹配要么为空(显然我猜)。我准备放弃了。
  • 没错。但是正如我所期望的那样,您使用 like 运算符的示例也不会返回空值?要获取此列,需要 is 运算符。
  • 我的第二条 sql 应该从第二条评论中解决您的问题。希望对您有所帮助。
  • 确实有帮助,谢谢。我根据您的建议添加了另一个答案,但我觉得更容易阅读和理解
猜你喜欢
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 2020-01-11
相关资源
最近更新 更多