2017-07-05 46 views
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 
) 

我應該怎麼寫正則表達式我需要?

回答

1

這工作好與我做處理援引括號一些變化:

var pattern = @"SELECT ((?:[^'()]|(?>'[^']+')|(?<open>\()|(?<-open>\)))+(?(open)(?!)))LIMIT (\d+)"; 

query = Regex.Replace(query, pattern, "SELECT TOP $2 $1"); 
+0

我無法測試您的正則表達式,因爲它有一個模式錯誤,請你解決這個問題?謝謝 – Rowandish

+0

我複製並粘貼它,它執行得很好。 – NetMage

+0

對不起,我在reg101網站上進行了模式錯誤測試,是我的錯。我測試了它,它工作正常,非常感謝! – Rowandish