我有一个查询形式的大字符串,例如: “SELECT column_name1,column_name2,column_name3,column_name4 FROM table1 JOIN table2 ON table1.field1 = table2.field1”(原始查询将有大约30个列名称,来自约6-8个表的连接)
现在我只想要这个字符串中的列名。我怎样才能做到这一点?
提前谢谢。
答案 0 :(得分:2)
你可以使用正则表达式或一些丑陋的IndexOf东西。基本字符串和/或正则表达式操作。
修改强> 您可以在http://www.regular-expressions.info/
上找到有关正则表达式的信息答案 1 :(得分:1)
有许多方法,包括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
}
}
答案 2 :(得分:0)
您可以使用正则表达式 - 例如:
string resultString = null;
try {
resultString = Regex.Match(subjectString, "SELECT (.+) FROM", RegexOptions.Singleline | RegexOptions.Multiline).Value;
} catch (ArgumentException ex) {
// Syntax error in the regular expression
}
答案 3 :(得分:0)
让人惊讶。粗暴的人群。
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];
}
答案 4 :(得分:0)
我想也许你会以错误的方式解决这个问题。
如果您自己编写此SQL字符串,那么您已经知道了这些名称,并且应该从某种集合构建您的SQL字符串。
如果您没有编写字符串,那么为什么不从结果集中获取列名?这假设他们当然拥有它们(和别名),并且在执行查询后获得名称并不重要。
如果你需要这样做并且你自己编写这个字符串,那么你需要动态构造查询,以便在数据再次出现时你有一些想法。