DB2 SQL不区分大小写

2ekbmq32  于 2022-11-07  发布在  DB2
关注(0)|答案(4)|浏览(242)

我正在通过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不区分大小写?

j2cgzkjk

j2cgzkjk1#

您可以使用类似于以下内容的内容:

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
ikfrs5lh

ikfrs5lh2#

这是一个常见问题,所以也许你应该阅读更多,例如:这个article是众多方法中的一个,存在各种方法。即使实现方式不同,示例原则也适用于Linux/Unix/Windows等i系列。
如果您缺少更改表的访问权限(例如添加列,索引等),则在 predicate 列上使用UPPER()LOWER()可能会导致性能下降。这可能会导致无法使用这些列上的索引,从而降低性能。
您应该首先验证Db2表中的相关列是否真的有大小写混合的值,如果它们只有一种情况,则更改查询以确保与该情况进行比较。
如果列具有大小写混合的值,并且不存在固定大小写的列(或UDF),并且如果出于重要的业务目的而频繁运行查询,则最佳建议是通过多种方法中的任意一种来确保表具有适当的设计(以支持不区分大小写的比较)。
如果您的Db2版本中提供正则表达式函数,您也可以考虑使用REGEXP_LIKE和适当的正则表达式。

vtwuwzda

vtwuwzda3#

数据库设置

database creation中有一个数据库配置设置,不过它是基于unicode的。

CREATE DATABASE yourDB USING COLLATE UCA500R1_S1

默认的Unicode排序规则算法由不带任何属性的UCA500R1关键字实现。由于默认的UCA不能同时包含Unicode支持的每种语言的排序规则序列,因此可以指定可选的属性来定制UCA排序。这些属性由下划线(_)字符分隔。UCA500R1关键字和任何属性构成一个UCA排序规则名称。
“强度”属性确定在整理或比较文本字符串时是否考虑重音或大小写。在没有大小写或重音的书写系统中,“强度”属性控制类似的重要功能。可能的值为:第一级(1)、第二级(2)、第三级(3)、第四级(4)和恒等式(I)。忽略:

  • 重音符和大小写,则使用主要强度级别
  • 仅在这种情况下,使用二级强度水平
  • 不区分重音和大小写,使用第三强度级别

几乎所有字符都可以通过前三个强度级别来区分,因此在大多数语言环境中,默认的“强度”属性设置为第三级。但是,如果“替代”属性(如下所述)被设置为移位,则四进制强度等级可用于打破白色字符、标点符号标识强度级别用于区分相似的字符,例如数学上的粗体小A字符(U+1D41A)和数学上的意大利小A字符(U+1D44E)。
将“强度”属性设置为较高级别将减慢文本字符串的比较速度并增加排序关键字的长度。示例:

  • UCA500R1_S1将整理“角色”=“角色”=“角色”
  • UCA500R1_S2将核对“角色”=“角色”〈“角色”
  • UCA500R1_S3将整理“角色”〈“角色”〈“角色”

这对我很有效。正如你所看到的,..._S2也忽略大小写。
使用newer standard version时,它应该如下所示:

CREATE DATABASE yourDB USING COLLATE CLDR181_S1

排序规则关键字:
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.
d4so4syb

d4so4syb4#

对于使用db2/400并通过php/pdo连接的我来说,我在/QOpenSys/etc/odbc. ini的odbc.ini中添加了一个DSN,其中包含jmarkmurphy指定的共享权重的以下连接选项子集:

[DSN]
SortSequence = 2  
LanguageID = ENU  
SortWeight = 0

IBM odbc连接选项可以在here中找到

相关问题