【问题标题】:Oracle where clause that matches all entries匹配所有条目的 Oracle where 子句
【发布时间】:2015-08-11 19:52:09
【问题描述】:

有没有一种方法可以在与字段中的所有条目匹配的字段上使用 where 子句构造参数化查询。例如,我正在想象像

这样的语法
'select brands from cars where brands = param'

如果param = 'Toyota' 则只返回匹配丰田的行,但如果param = * 则返回cars 表中的所有行。

【问题讨论】:

  • 您的意思是根本不添加where 子句过滤器?
  • 如果没有指定brands,可以动态不添加where子句过滤器是可以接受的。

标签: sql oracle


【解决方案1】:

试试这个。这是一个有条件的WHERE 子句

WHERE brands = NVL(param, brands)

表示如果参数是NULL,则使用brands = brands

【讨论】:

【解决方案2】:

通常的解决方法是

select brands from cars where brands LIKE param

如果 param = 'Toyota' 它只返回 Toyota

如果 param = '%' 则返回所有内容

简单但不一定高效。

【讨论】:

  • 这会有副作用吗,例如匹配 Toyota2? 之类的东西?
  • 只有传入Toyota_Toyota%
  • 谢谢,正如您预测的那样,这在我的数据库上非常慢。不知stackoverflow.com/a/31931369/2109289的解决方案是否更快
  • 是的,该解决方案很可能会更快。试试看。比较执行计划
【解决方案3】:
select * from cars where brands like '%'||parameter||'%'

您可以使用distinct 从您的表中获取所有品牌。

【讨论】:

  • 请查看问题的编辑。我特别需要where brands = * 之类的东西,这样我就可以将空参数或指定参数传递给它。
【解决方案4】:

如果你有一个变量,你会这样做:

where v_brand is null or v_brand = brand

如果您只想要一个匹配所有内容的表达式:

where 1 = 1

【讨论】:

    【解决方案5】:

    无论brand 是什么,返回所有行的正确方法是从过滤器中删除brands = param,而不是在其上使用通配符或函数...

    在您的情况下,通常将where 1=1 添加到子句中,并按以下模式使用:

    如果param 有值

    select brands from cars where 1=1 and brands = param
    

    否则,您只需删除 and brands = param 部分:

    select brands from cars where 1=1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      相关资源
      最近更新 更多