Разбор SQL-запросов по точке с запятой - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь прочитать, используя Scala, файл sql, полный запросов, которые нужно выполнить, однако я пытаюсь разобрать особые случаи, которые содержат точку с запятой, которая не является терминатором.Например, если запрос:

SELECT * FROM table WHERE name LIKE "%;%",

Он разделяет его на два оператора, даже если он должен быть один.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Предполагая, что терминатор запроса всегда равен ; в конце строки, мы можем использовать

  • .split(";\\s*\\n");, совпадающее с ; нулем или болееПробельные символы следуют за символом новой строки.

  • или .split("(?m);\\s*$") с использованием многострочного модификатора inline (?m), который позволяет сопоставить конец строки с $).

Пример кода:

 val a = """SELECT * FROM table WHERE name LIKE "%;%"
    AND regexp_replace(
      'abcd1234df-TEXT_I-WANT'  -- use your input column here instead
    , '^[a-z0-9]{10}-(.*)\$'     -- matches whole string, captures "TEXT_I-WANT" in \$1
    , '\$1'                      -- inserts \$1 to returnÖ TEXT_I-WANT
    ) = 'TEXT_I-WANT'
;
SELECT * FROM table WHERE name LIKE "%;%"
    AND regexp_replace(
      'abcd1234df-TEXT_I-WANT'  -- use your input column here instead
    , '^[a-z0-9]{10}-(.*)\$'     -- matches whole string, captures "TEXT_I-WANT" in \$1
    , '\$1'                      -- inserts \$1 to returnÖ TEXT_I-WANT
    ) = 'TEXT_I-WANT'
    ;""".split(";\\s*\\n")
println(a.mkString("Next Query:"))
  • Если вы предпочитаете совпадение, этот шаблон также может хорошо работать: "(?m)^[\\s\\S]*?;$"
    (добавить дополнительные пробелы\s при необходимости)

Полный образец:

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = new Regex("(?m)^[\\s\\S]*?;\\s*$")
      val str = """SELECT * FROM table WHERE name LIKE "%;%"
    AND regexp_replace(
      'abcd1234df-TEXT_I-WANT'  -- use your input column here instead
    , '^[a-z0-9]{10}-(.*)\$'     -- matches whole string, captures "TEXT_I-WANT" in \$1
    , '\$1'                      -- inserts \$1 to returnÖ TEXT_I-WANT
    ) = 'TEXT_I-WANT'
   ;        
   SELECT * FROM table WHERE name LIKE "%;%"
    AND regexp_replace(
      'abcd1234df-TEXT_I-WANT'  -- use your input column here instead
    , '^[a-z0-9]{10}-(.*)\$'     -- matches whole string, captures "TEXT_I-WANT" in \$1
    , '\$1'                      -- inserts \$1 to returnÖ TEXT_I-WANT
    ) = 'TEXT_I-WANT'
    ;"""

      println((pattern findAllIn str).mkString("\n----------------\n"))
   }
}
0 голосов
/ 06 июня 2018

Попробуйте Regex: ^.*?;$ с опцией m (для соответствия новой строке), как указано здесь

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...