跳至內容
Astera Technology

只搜含底線前綴,為何其他代碼也出現?

LIKE 格式內的字面字元要明確轉義。

下載完整個案資料及參考答案 ↓

準備報表輸入

本例來源只容大寫英文字母、數字及底線,報表要原字樣前綴 A_。LIKE 的底線可代表任何一字,所以 A_% 也配到 A12、AB1。轉義底線後,只有最後百分號代表其後任意文字。

以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。

假設輸入:codes
代碼
A12
AB1
A_1
下載可編輯 CSV ↓
完整建表及插入假設資料
CREATE TABLE codes(code TEXT NOT NULL PRIMARY KEY CHECK(code NOT GLOB '*[^A-Z0-9_]*')); INSERT INTO codes VALUES('A_1'),('AB1'),('A12');

比較錯誤及更正結果

錯誤 SELECT:重現問題
SELECT code FROM codes WHERE code LIKE 'A_%' ORDER BY code;
錯誤查詢的逐行結果
代碼
A12
AB1
A_1
下載可編輯 CSV ↓
更正 SELECT
SELECT code FROM codes WHERE code LIKE 'A!_%' ESCAPE '!' ORDER BY code;
更正查詢的逐行結果
代碼
A_1
下載可編輯 CSV ↓

錯誤結果三項,更正只留 A_1,原代碼不改。由字面輸入組搜尋格式時,要處理轉義。

用新副本測邊界

加入只得 A_、沒有後綴的代碼,百分號容許後面零字,所以 A_、A_1 都符合。

另開新資料庫重做原建表,才套下列改動及更正查詢。空結果在表內用已標明空結果文字表示,不是假資料行。

邊界改動及更正查詢
INSERT INTO codes VALUES('A_');
SELECT code FROM codes WHERE code LIKE 'A!_%' ESCAPE '!' ORDER BY code;
邊界查詢的逐行結果
代碼
A_
A_1
下載可編輯 CSV ↓

A_ 本身符合更正前綴嗎?

查看參考答案

符合,底線是原字,最後 % 可對空後綴,AB1 仍剔除。

相關資源