我正在尝试查询类似
的内容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。
答案 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,您应该拥有以下内容:
这样,你的选择会像查询一样大喊大叫(大而丑,但效率很高):
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%"
的任何可行情况,这样做会导致无法最大程度地使用优化器。