我正在通过SQL Server执行以下DB2 SQL(因此需要在DB2 SQL中):
exec ('
select
TRIM (vhitno) AS "Item",
TRIM (mmitds) AS "Description",
TRIM (SUBSTRING (vhitno,12,4)) AS "Size",
vhalqt AS "Available"
from m3fdbtest.oagrln
left outer join m3fdbtest.mdeohe
on vhcono = uwcono
and vhcuno = uwcuno
and vhagno = uwagno
and vhitno = uwobv1
left outer join m3fdbtest.mitmas
ON vhcono = mmcono
AND vhitno = mmitno
where uwcono = 1
and uwstdt >= ?
and uwlvdt <= ?
and uwcuno = ''JBHE0001''
and uwagst = ''20''
and (vhitno LIKE ''%'' || ? || ''%''
or mmitds LIKE ''%'' || ? || ''%'')',
@From, @To, @Search, @Search) at M3_TEST_ODBC
但是,DB2区分大小写 - 如何在mmitds和vhitno上使两个LIKES不区分大小写?
答案 0 :(得分:3)
您可以使用以下内容:
where UPPER(mycol) like '%' || UPPER(?) || '%'
注意:这可能会影响索引选择,但您可以创建如下索引:
create index MYINDEX on MYTABLE (UPPER(mycol))
如果您使用嵌入在RPG中的SQL,则可以将程序设置为使用不区分大小写的排序并与
进行比较SET OPTION SRTSEQ=*LANGIDSHR;
要使用JDBC执行此操作,您需要设置以下驱动程序属性:
"sort" = "language"
"sort language" = Your language code, I use "ENU"
"sort weight" = "shared"
对于ODBC连接,您需要设置以下连接属性:
SORTTYPE = 2
LANGUAGE = your language code, I use ENU
SORTWEIGHT = 0
答案 1 :(得分:1)
这是一个FAQ,所以也许你应该阅读更多内容,例如:这个article是其中之一,并且存在各种方法。即使实现方式不同,样本原则也适用于i-series作为Linux / Unix / Windows。
如果您无权进行表格更改(例如添加列,索引等),那么您可能会遇到在谓词列上使用UPPER()
或LOWER()
的性能损失。这可能导致这些列上的索引无法使用并且性能更差。
您应首先验证Db2表中的相关列是否确实具有混合大小写值,如果它们只有一个案例,则更改您的查询以确保您与该案例进行比较。
如果列具有大小写混合值并且不存在固定大小写列(或UDF),并且如果您的查询经常用于重要的业务目的,那么最好的建议是确保该表具有适当的设计(通过任何一种方法支持不区分大小写的比较。
如果您的Db2版本中有正则表达式函数,您还可以考虑使用REGEXP_LIKE和合适的正则表达式。
答案 2 :(得分:0)
您可以在database creation设置数据库配置设置。不过,它基于unicode。
CREATE DATABASE yourDB USING COLLATE UCA500R1_S1
默认的Unicode排序规则算法由UCA500R1关键字实现,没有任何属性。由于默认UCA不能同时包含Unicode支持的每种语言的整理顺序,因此可以指定可选属性来自定义UCA排序。属性由下划线(_)字符分隔。 UCA500R1关键字和任何属性构成UCA归类名称。
“强度”属性确定在整理或比较文本字符串时是否考虑重音或大小写。在编写没有大小写或重音的系统时,Strength属性控制着类似的重要功能。 可能的值是:primary(1),secondary(2),tertiary(3),quaternary(4)和identity(I)。忽略:
- 重音和案例,使用主要强度等级
- 仅限案例,使用次要级别
- 既不是重音也不是情况,使用三级强度等级
几乎所有字符都可以通过前三个强度级别进行区分,因此在大多数区域设置中,默认的“强度”属性设置为第三级。但是,如果将Alternate属性(如下所述)设置为shift,则可以使用四元强度级别来破坏空格字符,标点符号和否则将被忽略的符号之间的联系。身份强度等级用于区分相似的字符,例如MATHEMATICAL BOLD SMALL A字符(U + 1D41A)和MATHEMATICAL ITALIC SMALL A字符(U + 1D44E)。
将Strength属性设置为更高级别将减慢文本字符串比较并增加排序键的长度。 例子:
- UCA500R1_S1将整理“role”=“Role”=“rôle”
- UCA500R1_S2将整理“role”=“Role”&lt; “角色”
- UCA500R1_S3将整理“角色”&lt; “角色”&lt; “角色”
这对我有用。如您所见,...... _ S2也忽略了案例。
使用newer standard version,它应如下所示:
CREATE DATABASE yourDB USING COLLATE CLDR181_S1
Collation keywords:
UCA400R1
= Unicode标准4.0 = CLDR版本1.2
UCA500R1
= Unicode标准5.0 = CLDR版本1.5.1
CLDR181
= Unicode标准5.2 = CLDR版本1.8.1
如果您的数据库已经创建,那么应该有change the setting的方式。
CALL SYSPROC.ADMIN_CMD( 'UPDATE DB CFG USING DB_COLLNAME UCA500R1_S1 ' );
我确实在执行此操作时遇到了问题,但据我所知,它应该可以正常工作。
其他选择例如是generating a upper case row:
CREATE TABLE t (
id INTEGER NOT NULL PRIMARY KEY,
str VARCHAR(500),
ucase_str VARCHAR(500) GENERATED ALWAYS AS ( UPPER(str) )
)@
INSERT INTO t(id, str)
VALUES ( 1, 'Some String' )@
SELECT * FROM t@
ID STR UCASE_STR
----------- ------------------------------------ ------------------------------------
1 Some String SOME STRING
1 record(s) selected.