我有一個在 Postgres 中一直使用的正則運算式,我想將其轉換為 SQL Server,但我相信 SQL Server 缺乏使用正則運算式的全部功能。但是,我認為我的正則運算式應該足夠簡單,可以翻譯成LIKE陳述句。
這是我的正則運算式:^[123ABC]*([456]). 根據我對正則運算式的理解,我在這里使用的兩個功能是能夠匹配字串開頭的零個或多個字符并捕獲組。
這是一個使用 Postgres 的示例:
CREATE TABLE inventory (id INT, pcode VARCHAR(10));
INSERT INTO inventory VALUES (1, 'AABC547');
INSERT INTO inventory VALUES (2, '656ABC49');
INSERT INTO inventory VALUES (3, '11AB727');
INSERT INTO inventory VALUES (4, '7712346');
SELECT
id,
pcode,
COALESCE(
SUBSTRING(pcode from '^[123ABC]*([456])'):: int, 0
) AS desired_val
FROM inventory;
-- id pcode desired_val
-- 1 AABC547 5
-- 2 656ABC49 6
-- 3 11AB727 0
-- 4 7712346 0
這是我嘗試重寫它以與 SQL Server 一起使用的嘗試,該方法導致第一行錯誤,因為我沒有得到與我想要的模式匹配的第一個值[456],而是最后一個值。
SELECT
id,
pcode,
CASE
WHEN pcode LIKE '[456]%' THEN CAST(SUBSTRING(pcode, 1, 1) AS INT)
WHEN pcode LIKE '[123ABC]%4%' THEN 4
WHEN pcode LIKE '[123ABC]%5%' THEN 5
WHEN pcode LIKE '[123ABC]%6%' THEN 6
ELSE 0
END AS desired_val
FROM inventory;
-- id pcode desired_val
-- 1 AABC547 4
-- 2 656ABC49 6
-- 3 11AB727 0
-- 4 7712346 0
uj5u.com熱心網友回復:
如果你真的必須用純 T-SQL 來做這件事,你可以這樣寫:
SELECT
id,
pcode,
CASE
WHEN pcode LIKE '[456]%' THEN CAST(SUBSTRING(pcode, 1, 1) AS INT)
WHEN pcode LIKE REPLICATE('[123ABC]', CHARINDEX('4', pcode) - 1) '4%' THEN 4
WHEN pcode LIKE REPLICATE('[123ABC]', CHARINDEX('5', pcode) - 1) '5%' THEN 5
WHEN pcode LIKE REPLICATE('[123ABC]', CHARINDEX('6', pcode) - 1) '6%' THEN 6
ELSE 0
END AS desired_val
FROM inventory;
訣竅是用于CHARINDEX()獲取[456]字符第一次出現的位置,然后用于REPLICATE()重復[123ABC]模式的次數等于所需字符之前的字符數。因此,在第一個示例中,'5'char 位于第五個位置,構造的模式將是:
[123ABC][123ABC][123ABC][123ABC]5%
uj5u.com熱心網友回復:
替代解決方案:
create table #inventory(id int identity,pcode varchar(10))
insert into #inventory values ('AABC547')
insert into #inventory values ('656ABC49')
insert into #inventory values ('11AB727')
insert into #inventory values ('7712346')
SELECT
id,
pcode,
CASE
WHEN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(pcode,'1',''),'2',''),'3',''),'A',''),'B',''),'C','') LIKE '[456]%'
THEN CAST(SUBSTRING(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(pcode,'1',''),'2',''),'3',''),'A',''),'B',''),'C',''), 1, 1) AS INT)
ELSE 0
END AS desired_val
FROM #inventory;
drop table #inventory
此解決方案從 pcode 中洗掉允許的前導字符。這些 REPLACE 將洗掉所有匹配項。所以這只有在這些前導字符(“123ABC”)和您正在搜索的字符(“456”)之間沒有重疊時才有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/485668.html
