字串比較
字串比較有兩種不同類型。
二進位字串比較
二進位字串比較一律使用對照順序 *HEX ,並比較每一個字串的對應位元組。 此外,只有在兩個字串的長度相同時,兩個二進位字串才相等。 如果字串等於較短字串長度的上限,則即使較長字串中的剩餘位元組是十六進位零,也會將較短字串視為小於較長字串。 請注意,除非將字串強制轉型為二進位字串,否則無法將二進位字串與字串進行比較。
字元及圖形字串比較
對所有 SBCS 資料及混合資料的單位元組部分執行陳述式時,字元及 Unicode 圖形字串比較會使用有效的對照順序。 如果對照順序是 *HEX ,則會比較每一個字串的對應位元組。 對於所有其他對照順序,會比較每一個字串加權值的對應位元組。
如果字串具有不同的長度,則在比較之前,會在右側以空白填補較短字串的暫時副本。 填補會使每一個字串的長度相同。 無論對照順序為何,填補字元一律為空白。 對於位元資料,填補字元也是空白。 對於 DBCS 圖形資料,填補字元是 DBCS 空白 (x '4040')。 對於 Unicode 圖形資料,填補字元為 UTF-16 空白。 1
如果下列任何一項為真,則兩個字串相等:
- 兩個字串都是空的。
- 使用 *HEX 對照順序,且所有對應的位元組皆相等。
- 使用 *HEX 以外的對照順序,且加權值的所有對應位元組皆相等。
空字串等於空白字串。 兩個不相等字串之間的關係是由字串左端的第一對不相等位元組 (或加權值的位元組) 的比較來決定。 此比較是根據執行陳述式時有效的對照順序來進行。
在將在多個環境中執行的應用程式中,必須使用相同的對照順序 (取決於環境的 CCSID) 來確保相同的結果。 下表說明 EBCDIC、ASCII 及 Db2® LUW 預設對照順序之間的差異,方法是顯示根據每一個清單排序的清單。
| ASCII 和 Unicode | EBCDIC | Db2 LUW 預設值 |
|---|---|---|
0000 |
@@@@ |
0000 |
9999 |
co-op |
9999 |
@@@@ |
coop |
@@@@ |
COOP |
piano forte |
co-op |
PIANO-FORTE |
piano-forte |
COOP |
co-op |
COOP |
coop |
coop |
PIANO-FORTE |
piano forte |
piano forte |
0000 |
PIANO-FORTE |
piano-forte |
9999 |
piano-forte |
兩個具有不同長度的可變長度字串,如果它們僅在尾端空白的數目上不同,則它們是相等的。 在從這類值集中選取一個值的作業中,選取的值是任意的。 可能涉及此類任意選項的作業為 DISTINCT、MAX、MIN、UNION、EXCEPT、INTERSECT 及對分組直欄的參照。 如需分組直欄參照中涉及的任意選擇的相關資訊,請參閱 group-by-clause 。
比較的轉換規則:
當比較兩個字串時,必要的話,會先將其中一個字串轉換成另一個字串的編碼字集。 只有在符合下列所有條件時,才需要字元轉換:
- 兩個字串的 CCSID 不同。
- 這兩個 CCSID 都不是 65535。
- 選取要轉換的字串不是空值,也不是空的。
- 需要兩個 CCSID 之間的轉換。 如需相關資訊,請參閱 編碼字集及 CCSID。
如果比較兩個具有不同編碼方法的字串,則任何必要的轉換都會套用至字串,如下所示:
| 第一個運算元 | 第二個運算元 | |||
|---|---|---|---|---|
| SBCS 資料 | DBCS 資料 | 混合資料 | Unicode 圖形資料 | |
| SBCS 資料 | 見下文 | 秒 | 秒 | 秒 |
| DBCS 資料 | 第一個 | 見下文 | 秒 | 秒 |
| 混合資料 | 第一個 | 第一個 | 見下文 | 秒 |
| Unicode 圖形資料 | 第一個 | 第一個 | 第一個 | 見下文 |
否則,選取要轉換的字串取決於每一個運算元的類型。 下表顯示在給定運算元類型的情況下,選取用於轉換的運算元:
| 第一個運算元 | 第二個運算元 | ||||
|---|---|---|---|---|---|
| 直欄值 | 衍生值 | 特殊暫存器 | 常數 | 變數 | |
| 直欄值 | 秒 | 秒 | 秒 | 秒 | 秒 |
| 衍生值 | 第一個 | 秒 | 秒 | 秒 | 秒 |
| 特殊暫存器 | 第一個 | 第一個 | 秒 | 秒 | 秒 |
| 常數 | 第一個 | 第一個 | 第一個 | 秒 | 秒 |
| 變數 | 第一個 | 第一個 | 第一個 | 第一個 | 秒 |
在任何作業中使用包含外部編碼方法中資料的變數之前,一律有效轉換為原生編碼方法。 上述規則基於已發生此轉換的假設。
如果無法轉換字串的字元,或未定義 CCSID 配對之間的轉換,則會傳回錯誤。 如需相關資訊,請參閱 編碼字集及 CCSID。 如果字串的字元轉換成替代字元,則會出現警告。