簡體   English   中英

DB2 SQL 不區分大小寫

[英]DB2 SQL Case Insensitive

我正在通過 SQL 服務器執行以下 DB2 SQL (所以需要在 ZC890025415F105B86EC74 中)

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 不區分大小寫?

您可以使用如下形式:

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

這是一個常見問題解答,因此也許您應該閱讀更多,例如: 本文是其中之一,並且存在各種方法。 即使實現不同,示例原則也適用於i系列,如Linux / Unix / Windows。

如果您無權進行表更改(例如,添加列,索引等),則可能會對謂詞列使用UPPER()LOWER()造成性能損失。 這可能會導致這些列上的索引無法使用,並降低性能。

您應該首先驗證Db2表中的相關列是否確實具有大小寫混合的值,如果它們只有一個大小寫,則請更改查詢以確保與該大小寫進行比較。

如果列具有大小寫混合的值,並且不存在固定大小寫的列(或UDF),並且如果出於關鍵業務目的經常運行查詢,則最佳建議是確保表具有適當的設計(以支持大小寫)不敏感的比較)。

如果Db2版本中提供了正則表達式函數,則您也可以考慮使用REGEXP_LIKE和合適的正則表達式。

數據庫設置

您可以在創建數據庫時設置數據庫配置設置。 不過它是基於unicode的。

CREATE DATABASE yourDB USING COLLATE UCA500R1_S1

默認的Unicode排序算法由UCA500R1關鍵字實現,沒有任何屬性。 由於默認的UCA無法同時包含Unicode支持的每種語言的整理順序,因此可以指定可選屬性來自定義UCA排序。 屬性由下划線(_)字符分隔。 UCA500R1關鍵字和任何屬性構成UCA歸類名稱。

強度屬性確定在整理或比較文本字符串時是否考慮重音或大小寫。 在沒有大小寫或重音符號的書寫系統中,“強度”屬性控制着同樣重要的功能。 可能的值是:主要(1),次要(2),第三(3),四元(4)和身份(I)。 忽視:

  • 重音和大小寫,使用主要強度級別
  • 僅在使用情況下,使用二級強度等級
  • 既不強調也不區分大小寫,請使用三級強度等級

前三個強度級別幾乎可以區分所有字符,因此在大多數語言環境中,默認的Strength屬性都設置在第三級。 但是,如果將Alternate屬性(如下所述)設置為shifted,則可以使用四元強度級別來打破空白字符,標點符號和否則會被忽略的符號之間的聯系。 同一性強度級別用於區分相似的字符,例如數學粗體小字符(U + 1D41A)和數學斜體小字符(U + 1D44E)。

將“強度”屬性設置為更高的級別將減慢文本字符串比較的速度並增加排序鍵的長度。 例子:

  • UCA500R1_S1將整理“ role” =“ Role” =“rôle”
  • UCA500R1_S2將整理“ role” =“ Role” <“rôle”
  • UCA500R1_S3將整理“ role” <“ Role” <“rôle”

這對我有用。 如您所見,..._ S2也忽略大小寫。

使用較新的標准版本 ,它應如下所示:

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

如果您的數據庫已經創建,則應該有一種更改設置的方法

CALL SYSPROC.ADMIN_CMD( 'UPDATE DB CFG USING DB_COLLNAME UCA500R1_S1 ' );

我確實在執行此操作時遇到問題,但就我所知,它應該可以工作。

生成表行

其他選項例如是生成一個大寫的行

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.

對於使用 db2/400 並通過 php/pdo 連接的我,我在 /QOpenSys/etc/odbc.ini 中向 odbc.ini 添加了一個 DSN。 使用 jmarkmurphy 指定的以下共享權重連接選項子集:

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

IBM odbc 連接選項可在此處找到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM