【问题标题】:How to get a substring from a large string?如何从大字符串中获取子字符串?
【发布时间】:2011-11-30 17:55:05
【问题描述】:

我有一个查询形式的大字符串,例如: "SELECT column_name1, column_name2, column_name3, column_name4 FROM table1 JOIN table2 ON table1.field1 = table2.field1"(原始查询将有大约 30 个列名来自大约 6-8 个表的连接)

现在我只想要这个字符串中的列名。我怎样才能做到这一点?

提前谢谢你。

【问题讨论】:

  • 您能自己想出任何可能有用的算法作为起点吗?

标签: c#


【解决方案1】:

您可以使用正则表达式或一些丑陋的 IndexOf 东西。基本字符串和/或正则表达式操作。

编辑: 您可以在http://www.regular-expressions.info/上找到有关正则表达式的信息

【讨论】:

    【解决方案2】:

    有很多方法,包括 LINQ 和 RegEx,但这里有一个使用字符串的 Split 函数的过程。请注意,此循环假定列名非常单调,并且不会假定列名中的逗号或空格等特殊情况。

    using System;
    using System.Collections.Generic;
    
    public class MyClass
    {
        public static void Main()
        {
            List<string> columns = new List<string>(); // columns collection
    
            string sql = "SELECT column_name1, column_name2, column_name3, column_name4 FROM table1 JOIN table2 ON table1.field1 = table2.field1";
            string[] parts = sql.Split(new char[] {' ', ','}, StringSplitOptions.RemoveEmptyEntries);
    
            for (int i=1; i<parts.Length; i++)
            {
                if (parts[i].Equals("FROM")) break;
    
                columns.Add(parts[i]); // add cols to collection
            }
    
            foreach(string column in columns)
                Console.WriteLine(column); // print out the columns
        }
    }
    

    【讨论】:

    • 这能经受住那些逗号可能存在​​于子查询中的更复杂的查询吗?
    • @Moo-Juice:不。我在回答中提到了这个问题。第二句。
    • 致 Moo-Juice:另外,我不需要子查询中的列名。我需要的只是第一个“SELECT”之后和第一个“FROM”之前的列名。 @PaulSasik:这几乎就是我能想到的,但我仍然想知道是否有更好的方法。不过感谢这个解决方案。我才意识到我没有想错。
    • @Baiju:更好是一个非常相对的术语。你有什么顾虑和考虑?我一开始确实提到你可以使用 RegEx 或 LINQ 来做到这一点。这个过程比 LINQ 更迫切,但相当简单。
    • 我会保持相同的循环,但在内部对 '.' 执行第二次拆分调用如果它存在,则采取第二部分,否则第一部分。
    【解决方案3】:

    您可以使用正则表达式 - 例如:

    string resultString = null;
    try {
    resultString = Regex.Match(subjectString, "SELECT (.+) FROM", RegexOptions.Singleline  | RegexOptions.Multiline).Value;
    } catch (ArgumentException ex) {
    // Syntax error in the regular expression
    }
    

    【讨论】:

    • 我要试试这个,看看它是否满足我的要求。非常感谢。
    【解决方案4】:

    哎呀。粗暴的人群。

            string query = "SELECT this, that, there, when, who, what, FROM Words";
            string[] split = query.Split(' ');
            string[] columns = new string[30];
    
            for (int i = 1; i < split.Length; i++)
            {
                if (split[i].ToUpper() == "FROM")
                    break;
                columns[i - 1] = split[i];
            }
    

    【讨论】:

      【解决方案5】:

      我认为您可能以错误的方式处理此问题。

      如果您自己编写此 SQL 字符串,那么您已经知道名称,并且应该从某种集合构造您的 SQL 字符串。

      如果你不写字符串,那为什么不从结果集中获取列名呢?这当然假定他们拥有它们(和别名),并且在执行查询之后获得名称并不重要。

      如果您需要这样做并且您自己编写此字符串,那么您需要动态构造查询,以便在数据再次返回时有一些类似的想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-06
        • 2021-12-23
        • 1970-01-01
        • 2023-03-25
        • 2015-11-04
        相关资源
        最近更新 更多