2

SQL ステートメントの fields 句を置き換える単純な関数を開発したい

このようなもの

replaceFields("select  * from x", "f1")
// should return "select f1 from x"

replaceFields("select top 10 *   FROM x", "f1")
// should return "select top 10 f1   FROM x"

replaceFields("select top 10 f3, f4    FROM x", "f1, f2")
// should return "select top 10 f1, f2    FROM x"

これは本当に簡単なはずですが、いくつかの正規表現を試しましたが、見つからないようです

"select * from".replaceFirst("""select (\w+) from""", "count(*)")
// returns "select * from"

"select * from".replaceFirst("""select(\b(.*))\bfrom""", "count(*)")
// returns "count(*)"

しかし、うまくいきませんでした...

4

2 に答える 2

1

正しく交換しています

select(\b(.*))\bfrom

間の部分だけを置き換えたい場合は、置き換える文字列にそれらを含めないでくださいselectfrom試す

(?<=select\b)(.*?) from

と置き換えます

count(*) from 

編集:

テーブルの列のリストを置き換えたいようです。

すべての列名が、selectステートメントの後にあるようなキーワードのリストの後にあると仮定してTOP、関連する引数を使用してこの正規表現を作成しました

(([^\s]+,\s+)*([^\s]+)\s+)from

これは、列名(置換する)が前のトークン(この単語を許可)であるかfrom、他のトークンからコンマで区切られているという原則に基づいています。

その後、ケースはこのように管理されます

token token, token FROM
      ^this is the starting point of substitution

token FROM
^this is the starting point

最初のグループを必要なものに置き換えれば、問題ありません。ここでテストしてください

于 2012-10-03T13:19:15.937 に答える
1

gabber ヘルプのおかげで、正規表現に (それほどではありませんが) 少し苦労しましたが、この解決策にたどり着きました。

def replaceFields(sql: String, fields: String): String = {
  val parseSql = """(?imx)                #insensitive case, multiline, whitespaces and comments
    (^ select \s+ #(?:top \s+ \d+ \s+)?)  #m1: select clause and optional clauses
      (?:top \s+ \d+ \s+)?                #  top x clause (ignored match)
      (?:(?:distinct|all) \s+)?           #  distinct | all clause (ignored match)
    )
    (.+?)                                 #m2: the field clause I'm looking for, non greedy to leave spaces to match3
    (\s+ from \s+ .* $)                   #m3: the rest of the sql sentence, greedy spaces
  """.r
  val replace = "$1%s$3".format(fields)   // replace match2 with new fields
  parseSql.replaceFirstIn(sql, replace)
}

与える:

scala> replaceFields("select * from x", "count(*)")
res1: String = select count(*) from x

scala> replaceFields("select top 24 f1, f2 from x", "f3, f4, f5")
res2: String = select top 24 f3, f4, f5 from x

scala> replaceFields("select  f1  from x", " f2,  f3 ")
res3: String = select   f2,  f3   from x

scala> replaceFields("select top 23 distinct f1, f2 from x", "f3, f4, f5")
res0: String = select top 23 distinct f3, f4, f5 from x
于 2012-10-04T04:08:54.000 に答える