SQL中的本地化或自定义列名

本文关键字:自定义 本地化 SQL | 更新日期: 2023-09-27 18:01:28

我有两个表,在其中我抽象了SQL列名。第一个表有一个"原始"列名和一个"标题"名称。第二个表使用"原始"列名。

--Columns table
ColumnName          HeaderName
StandardColumn_1    balance
StandardColumn_2    FName
StandardColumn_3    LName       
StandardColumn_4    Age
--Records table
StandardColumn_1    StandardColumn_2      StandardColumn_3
Value1              Value2                Value3

现在,我必须使用C#中的"头"名称编写一个查询。如何使用"表头"名称查询记录表?

例如string balance = "StandardColumn_1";,但我需要从列表中动态获取值。

SQL中的本地化或自定义列名

简单的方法是只查询第一个表,并将其存储在用于查询第二个表的Dictionary中。

 Dictionary<string, string> columnMap = new Dictionary<string, string>();
 using (var conn = new SqlConnection(...))
 using (var cmd = new SqlCommand("SELECT HeaderName, ColumnName FROM Columns"))
 using (var dr = cmd.ExecuteReader()) 
 {
     while (dr.Read()) 
     {
        columnMap.Add(dr.GetString(0), dr.GetString(1));
     }
 }

现在,您有了一个从HeaderNameColumnName的映射,可以用来构建SQL查询。缓存此映射是一种常见的做法,因为标头名称通常是通过某种设置过程完成的,并且不会经常更改。

如果你的"标题"名称足够唯一,那么一个简单的替换就可以了:

 const string originalSql = "SELECT Balance FROM Records WHERE Age = 23";
 string convertedSql = originalSql;
 foreach (var kvp in columnMap) 
 {
       convertedSql = convertedSql.Replace(kvp.Key, kvp.Value);
 }

如果不能保证它们是唯一的子字符串(例如,可以有"Name"answers"FName"(,那么可能需要使用正则表达式来替换。

你试图实现的目标对我来说有点神秘,但无论如何我都会尽力回答。我假设Column NameStandardColumn_i字符串的序列,其中i >= 1,并且您希望将连续的"标准列"分配给一组已知的字符串。一种方法是创建一个字典并将其填充到循环中。

首先,我们创建一个包含所有标头名称和标准前缀的数组。

string[] headers = new[] { "balance", "FName", "LName", "Age" };
string prefix = "StandardColumn_";

然后,我们创建一个新的Dictionary对象,并在循环中填充"标准列":

Dictionary<string, string> columnDict = new Dictionary<string, string>
for (int i = 0; i < headers.Length; i++)
{
    columnDict.Add(headers[i], prefix + (i + 1));
}

现在,您可以使用索引器检索列名,如下所示:

Console.WriteLine(dict["FName"]); // prints 'StandardColumn_2'