多个像在同一列DB2上

时间:2009-04-24 11:34:13

标签: sql syntax db2

我正在尝试查询类似

的内容
select emp_id from dept.employee where
  firstname like '%sam%' or 
  firstname like '%SAM%' or
  firstname like '%will%' or
  firstname like '%WILL%'

是否可以将其置于正则表达式中

select emp_id from dept.employee where
  firstname like '%sam|SAM|will|WILL%'

select emp_id from dept.employee where
  upper(firstname) like '%sam%' or
  upper(firstname) like '%will%'

我正在使用DB2 UDB9。

2 个答案:

答案 0 :(得分:1)

不幸的是,DB2中没有立即可用的Regex函数。但是可以使用实现正则表达式的外部用户定义函数(调用外部CLI,.NET或Java函数)。这是IBM的一个现成的例子:

http://www.ibm.com/developerworks/data/library/techarticle/0301stolze/0301stolze.html

答案 1 :(得分:0)

这是一个糟糕的例子或糟糕的数据库设计: - )。

您可能不应以任何需要使用LIKE的方式存储第一个(或任何)名称。您需要记住,表格几乎始终读取的次数远远超过书面,并相应地进行设计。

这意味着您希望在插入或更新时花费成本,而不是选择。诸如upper(name)之类的每行功能永远不能很好地扩展到适当的企业级数据库。

在我看来,对于DB2,您应该拥有以下内容:

  • 一个插入/更新触发器,它将从第一个(和最后一个)名称中删除前导和尾随空格。
  • 一个生成的列,它将使名称大写(这会使用更多的存储空间,但这通常比浪费时间更好)。我不确定UDB9是否已生成列(DB2 / z有)但您可以在相同的插入/更新触发器中执行此操作。基本上它是一个额外的列,总是设置为另一个字段的大写版本。
  • 生成列的索引,而不是原始列。

这样,你的选择会像查询一样大喊大叫(大而丑,但效率很高):

select * from tbl
where generatedname = 'SAM'
or    generatedname = 'SAMUEL'
or    generatedname = 'SAMANTHA'
or    generatedname = 'WILL'
or    generatedname = 'WILLIAM'
or    generatedname = 'WILLOMENA'

或(不那么大又丑,同样有效,并且更接近于意图中的原始查询):

select * from tbl
where generatedname like 'SAM%'
or    generatedname like 'WILL%'

使用查询优化器(DB2和其他DBMS'的全部功能,我认为,如果字段被索引,仍然可以轻松优化'XX%'。

我不是很喜欢将LIKE用于任何体面的大小桌子,尽管有时没有多少选择。我想不出你想要查找"%SAM%"的任何可行情况,这样做会导致无法最大程度地使用优化器。