0
我有一些爲PostgreSQL編寫的查詢字符串,我必須將它們轉換爲SqlServer。我使用C#6正則表達式將LIMIT語法轉換爲SqlServer TOP語法
爲了從LIMIT語法TOP語法我已經寫了下面的簡單的regex轉換:
SELECT ([\S\s]*)LIMIT (\d+) -> SELECT TOP $2 $1
整條生產線的代碼是:
return Regex.Replace(query, @"SELECT ([\S\s]*)LIMIT (\d+)", "SELECT TOP $2 $1", RegexOptions.RightToLeft);
現在,eveything對於簡單的查詢工作正常,但對於子查詢不起作用:TOP字符串每次都放入超級父查詢中。
嘗試例如下面的查詢:
SELECT b3.aaa,
b3.count
FROM
(
SELECT CONCAT(b.foo/100.0, '-', (b.foo + 10)/100.0) AS aaa,
COUNT(b.foo) AS count
FROM
(
SELECT b2.foo - (b2.foo % 10) AS foo
FROM
(
SELECT CAST(b.foo * 100 AS INT) AS foo
FROM eee b
INNER JOIN bar f ON b.bar_id = f.id
WHERE b.foo < 1
AND f.nome = 'aaa'
) b2
) b
GROUP BY b.foo
ORDER BY b.foo
LIMIT 10
)
它轉換爲:
SELECT TOP 10 b3.aaa,
b3.count
FROM
(
SELECT CONCAT(b.foo/100.0, '-', (b.foo + 10)/100.0) AS aaa,
COUNT(b.foo) AS count
FROM
(
SELECT b2.foo - (b2.foo % 10) AS foo
FROM
(
SELECT CAST(b.foo * 100 AS INT) AS foo
FROM eee b
INNER JOIN bar f ON b.bar_id = f.id
WHERE b.foo < 1
AND f.nome = 'aaa'
) b2
) b
GROUP BY b.foo
ORDER BY b.foo
)
,而我想有
SELECT b3.aaa,
b3.count
FROM
(
SELECT TOP 10 CONCAT(b.foo/100.0, '-', (b.foo + 10)/100.0) AS aaa,
COUNT(b.foo) AS count
FROM
(
SELECT b2.foo - (b2.foo % 10) AS foo
FROM
(
SELECT CAST(b.foo * 100 AS INT) AS foo
FROM eee b
INNER JOIN bar f ON b.bar_id = f.id
WHERE b.foo < 1
AND f.nome = 'aaa'
) b2
) b
GROUP BY b.foo
ORDER BY b.foo
)
我應該怎麼寫正則表達式我需要?
我無法測試您的正則表達式,因爲它有一個模式錯誤,請你解決這個問題?謝謝 – Rowandish
我複製並粘貼它,它執行得很好。 – NetMage
對不起,我在reg101網站上進行了模式錯誤測試,是我的錯。我測試了它,它工作正常,非常感謝! – Rowandish