我试图在第一个字符是小写字母的字段中选择一个值。这很困难,因为DB2不允许使用正则表达式。我目前的尝试是:
select * from mytable
where field1 like lcase('_%')
我希望下划线后跟百分号通配符会在第一个位置找到任何字符,然后将lcase()包裹起来以确保它是小写的。结果是任何和每个值都被选中,所以lcase()没有执行我想要它做的事情,并且后见之明用于转换为小写。
考虑到这一点,我如何确保
的结果('_%')
只是小写?
非常感谢
答案 0 :(得分:2)
我会使用类似的东西:
... where substr(field1,1,1) <> upper(substr(field1,1,1))
使用'a'...'z'
的解决方案不适用于与拉丁字符集不同的字符(例如cyrilic等)
答案 1 :(得分:1)
为什么不
where field1 >= 'a' and field1 < '{'
这甚至会使用适当的索引(如果有的话)。 但是,请注意,当您的数据库实例执行lexicongraphic排序时,这将不起作用。但是,我不确定后者是DB属性还是会话属性。
另一种更通用的方法(特别是在考虑非ASCII字母时)将检查字段的长度是否> 0和由第一个字符组成的小写子字符串等于由第一个字符组成的子字符串,而大写的第一个字符不等于第一个字符。 (查看DB2参考中的函数,我现在还没准备好。)
答案 2 :(得分:0)
DB2 DOES 允许使用xQuery的正则表达式。例如:
with cteGender(VALUE) as
(
values
('M'),('F'),('U'),('S'),(' M'),('f')
),
cteResult(VALUE,RESULT_BOOLEAN) as
(
select '"' || VALUE || ‘"',
xmlquery('fn:matches($VALUE,''^[MFU]{1}$'')') from cteGender
)
select VALUE, RESULT_BOOLEAN,
xmlcast(RESULT_BOOLEAN as integer) RESULT_INTEGER from cteResult;
我从这个例子开始:http://www.idug.org/p/bl/et/blogid=278&blogaid=187那篇文章很好地解释了如何使用xQuery。
DB2没有正则表达式的SQL函数,但是使用xQuery可以做到这一点。但如果您真的想要RegEx的SQL函数,请访问此站点:https://www.ibm.com/developerworks/jp/data/library/db2/j_d-regularexpression/(日语,但代码可以理解)
有关DB2中RegEx的更多信息,请访问:http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.xml.doc/doc/xqrregexp.html