我需要在 CURSOR 中對 SQL 進行一些更改。以前,列“代碼”的最大值為4 個字符(例如 K100、K101、....K999),但現在需要為8個字符(例如,K1000、K1001、K1002、....K1000000)。
CURSOR c_code(i_prefix VARCHAR2)
IS
SELECT NVL(MAX(SUBSTR(code,2)) 1,100) code
FROM users
WHERE code LIKE i_prefix||'___';
' code ' 列的值從 100 開始,每次插入新記錄時遞增 1。目前,最大值是“K999”,我希望它是 K1000、K1001、K1002 等。
我已將用戶表中的“代碼”列更改并修改為 VARCHAR(8)。
注意: i_prefix 值始終為“K”。
我試圖修改 SQL -
CURSOR c_code(i_prefix VARCHAR2)
IS
SELECT NVL(MAX(SUBSTR(code,2)) 1,100) code
FROM users
WHERE code LIKE i_prefix||'________';
但是,每次插入記錄時,它都會從 100 而不是從 K1000、K1001、K1002 等重新開始。
有人建議我使用 REGEXP_LIKE() 但不確定在這種情況下如何正確使用它來獲得所需的結果。
您能否指導我如何使用REGEXP_LIKE()獲得此結果。
謝謝你。
uj5u.com熱心網友回復:
你的舊代碼
WHERE code LIKE i_prefix||'___';
將匹配 K 后跟恰好三個字符,這就是您所擁有的。您的新代碼
WHERE code LIKE i_prefix||'________';
將匹配 K 后跟正好八個字符,這對于一開始來說太多了,因為你說總長度是八 - 這意味著你需要服務器通配符占位符:
WHERE code LIKE i_prefix||'_______';
...但是目前這仍然行不通,因為您現有的值并不長。由于您當前的所有值至少為四個,因此您可以執行以下操作:
WHERE code LIKE i_prefix||'___%';
這將匹配 K 后跟三個或更多字符 - 沒有上限,但無論如何你的列也被限制為八個。
如果您確實想使用通常較慢的正則運算式,您可以這樣做:
WHERE REGEXP_LIKE(code, i_prefix||'.{3,7}');
這將匹配 K 后跟三到七個字符,或者:
WHERE REGEXP_LIKE(code, i_prefix||'\d{3,7}');
這只會匹配 K 后跟三到七位數。
小提琴
但是,我建議您使用序列來生成數字部分,并在其前面加上 K 字符。該序列可以從沒有資料的新系統上的 100 開始,或者從有資料的現有系統中的當前最大數量開始。
我還會考慮對資料(包括所有現有值)進行零填充,以允許對它們進行比較;所以將 K100 更新為 K0000100。或者如果你不能這樣做,一旦你通過 K199 跳轉到 K2000000。然后,要么將值輕松排序為字串。或者,也許,添加一個將數字部分提取為數字的虛擬列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522186.html
標籤:sql甲骨文正则表达式
上一篇:在mysql中為翻譯器復制行
下一篇:用于從字串列印模式的正則運算式
