【问题标题】:DB2 SQL Case InsensitiveDB2 SQL 不区分大小写
【发布时间】:2017-11-07 16:03:38
【问题描述】:

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

【问题讨论】:

  • 尝试不同的排序规则。
  • 转换列值UPPERLOWER

标签: sql db2 ibm-midrange


【解决方案1】:

你可以这样使用:

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

【讨论】:

  • 请注意,使用共享排序权重时,您需要使用共享排序权重创建索引。
  • @Charles 嗯...从来没有做过任何特别的工作。我猜它可能会影响性能,但我还没有看到。
  • 是的,影响性能,如果索引不是共享权重,则不会使用。
  • 即使您没有索引,优化器似乎也很擅长对组进行排序,因此除非您确实遇到性能问题,否则我不会更改任何内容。
【解决方案2】:

这是一个常见问题解答,所以也许您应该阅读更多内容,例如:article 是众多方法之一,并且存在各种方法。示例原则适用于 Linux/Unix/Windows 等 i 系列,即使实现有所不同。

如果您无法进行表更改(例如添加列、索引等),那么您可能会遭受在谓词列上使用 UPPER()LOWER() 的性能损失。这可能会导致无法使用这些列上的索引并降低性能。

您应该首先验证 Db2 表中的相关列是否真的有大小写混合的值,如果它们只有一个大小写,那么更改您的查询以确保您与那个案例进行比较。

如果列具有混合大小写的值并且不存在固定大小写列(或 UDF),并且如果您的查询将出于重要的业务目的而频繁运行,那么最好的建议是确保表具有适当的设计(支持不区分大小写的比较)通过多种方法中的任何一种。

如果您的 Db2 版本中提供正则表达式函数,您还可以考虑使用 REGEXP_LIKE 和合适的正则表达式。

【讨论】:

  • 感谢您,但是,我不能对 IBM 表进行任何潜在的更改。我有纯只读访问权限
【解决方案3】:

数据库设置

您可以在database creation 设置一个数据库配置设置。不过,它是基于 unicode 的。

CREATE DATABASE yourDB USING COLLATE UCA500R1_S1

默认的 Unicode 排序算法由不带任何属性的 UCA500R1 关键字实现。由于默认 UCA 不能同时包含 Unicode 支持的每种语言的整理顺序,因此可以指定可选属性来自定义 UCA 排序。属性由下划线 (_) 字符分隔。 UCA500R1 关键字和任何属性构成一个 UCA 归类名称。

Strength 属性确定在整理或比较文本字符串时是否考虑重音或大小写。在没有大小写或重音的书写系统中,Strength 属性控制着同样重要的特征。 可能的值是:一级 (1)、二级 (2)、三级 (3)、四级 (4) 和同一性 (I)。忽略:

  • 口音和大小写,使用主要强度级别
  • 仅限案例,使用二级强度等级
  • 既不重音也不大小写,使用三级强度级别

几乎所有字符都可以通过前三个强度级别来区分,因此在大多数语言环境中,默认强度属性设置为第三级。但是,如果将 Alternate 属性(如下所述)设置为 shift,则可以使用四元强度级别来打破空白字符、标点符号和符号之间的联系,否则会被忽略。标识强度等级用于区分相似的字符,例如 MATHEMATICAL BOLD SMALL A 字符 (U+1D41A) 和 MATHEMATICAL ITALIC SMALL A 字符 (U+1D44E)。

将强度属性设置为更高级别将减慢文本字符串比较并增加排序键的长度。 例子:

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

这对我有用。如您所见,..._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.

【讨论】:

  • 很遗憾,CREATE DATABASE 不适用于ibm-midrange
  • 所以我猜你也不能更改设置。 CREATE TABLE 使用生成的表格行呢?
  • 不是你提到的方式,但是如果你看我的回答你会发现它基本上有你的建议。 DB2 for i 可以给出多个字符集的响应,并根据请求的语言 id 和排序序列对序列进行排序。它为您处理转换。尽管您可能需要具有请求的语言和排序特征的索引以提高性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2015-07-05
  • 2013-09-22
  • 2013-10-25
  • 2012-12-01
相关资源
最近更新 更多