DB2 SQL案例不敏感

时间:2017-11-07 16:03:38

标签: sql db2 ibm-midrange

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

3 个答案:

答案 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.