将可变长度数据映射到固定结构的最佳方法?
Best approach to map data of variable length to a fixed structure?
给定一个固定的目标数据table例如
1 2 3 4 5
Spain, Portugal, France, Italy, Greece
输入由数据列加上启用列的可配置列表组成,例如 [1, 4]
即输入可能仅包含 Spain
和 Italy
.
目的是构建一个 SQL 语句(虽然它本身不是一个 SQL 问题),它只会设置可用的列在输入到他们正确的位置。
可能的输入:
enabled columns: 2,4,5
data:
p1 i1 g1
p2 i2 g2
.............
尝试以编程方式(在 java 中)而不是在 SQL 中执行此操作,并且不太确定如何避免 if
和 else
的疯狂分支的。
问题不只是关于这种特定情况,也不是真正的 sql 或另一种编程语言,而是关于如何在给定某种形式的定义的情况下将变量输入映射到固定输出,例如在这种情况下的指数。
如果我没有误解你的问题,你想在 SQL 中生成一系列 INSERT INTO 命令,以将新元组添加到 table,保存未在使用一些默认值(例如 NULL)输入程序。因此,在您的示例中,您希望生成以下 SQL 语句:
INSERT INTO YOUR_TABLE_NAME(NULL,p1,NULL,i1,g1);
INSERT INTO YOUR_TABLE_NAME(NULL,p2,NULL,i2,g2);
那么,这个函数可以实现如下:
public static String insertOptional(int[] inputColumns, String[][] data) {
// start of the simple algorithm
final String tableName = "YOUR_TABLE_NAME";
final int columnsOfTable = 5; // as in your example
StringBuilder sqlStatement = new StringBuilder();
for (String[] tuple : data) {
sqlStatement.append("INSERT INTO ")
.append(tableName)
.append("(");
int inputColumnIndex = 0;
for (int columnIndex = 1; columnIndex <= columnsOfTable; columnIndex++) {
if (columnIndex == inputColumns[inputColumnIndex]) {
sqlStatement.append(tuple[inputColumnIndex]);
inputColumnIndex++;
} else {
// replace "NULL" with your default value for
// fields that are not given as input
sqlStatement.append("NULL");
}
if (columnIndex < columnsOfTable)
sqlStatement.append(",");
}
sqlStatement.append(");\n");
}
return sqlStatement.toString();
}
并且,您的示例可以按如下方式执行:
public static void main(String[] args) {
int[] inputColumns = { 2, 4, 5 };
String[][] data = { { "p1", "i1", "g1" }, { "p2", "i2", "g2" } };
String sqlStatement = insertOptional(inputColumns, data);
System.out.println(sqlStatement);
}
这个 main 方法打印出我认为你期望的结果:
INSERT INTO YOUR_TABLE_NAME(NULL,p1,NULL,i1,g1);
INSERT INTO YOUR_TABLE_NAME(NULL,p2,NULL,i2,g2);
给定一个固定的目标数据table例如
1 2 3 4 5
Spain, Portugal, France, Italy, Greece
输入由数据列加上启用列的可配置列表组成,例如 [1, 4]
即输入可能仅包含 Spain
和 Italy
.
目的是构建一个 SQL 语句(虽然它本身不是一个 SQL 问题),它只会设置可用的列在输入到他们正确的位置。
可能的输入:
enabled columns: 2,4,5
data:
p1 i1 g1
p2 i2 g2
.............
尝试以编程方式(在 java 中)而不是在 SQL 中执行此操作,并且不太确定如何避免 if
和 else
的疯狂分支的。
问题不只是关于这种特定情况,也不是真正的 sql 或另一种编程语言,而是关于如何在给定某种形式的定义的情况下将变量输入映射到固定输出,例如在这种情况下的指数。
如果我没有误解你的问题,你想在 SQL 中生成一系列 INSERT INTO 命令,以将新元组添加到 table,保存未在使用一些默认值(例如 NULL)输入程序。因此,在您的示例中,您希望生成以下 SQL 语句:
INSERT INTO YOUR_TABLE_NAME(NULL,p1,NULL,i1,g1);
INSERT INTO YOUR_TABLE_NAME(NULL,p2,NULL,i2,g2);
那么,这个函数可以实现如下:
public static String insertOptional(int[] inputColumns, String[][] data) {
// start of the simple algorithm
final String tableName = "YOUR_TABLE_NAME";
final int columnsOfTable = 5; // as in your example
StringBuilder sqlStatement = new StringBuilder();
for (String[] tuple : data) {
sqlStatement.append("INSERT INTO ")
.append(tableName)
.append("(");
int inputColumnIndex = 0;
for (int columnIndex = 1; columnIndex <= columnsOfTable; columnIndex++) {
if (columnIndex == inputColumns[inputColumnIndex]) {
sqlStatement.append(tuple[inputColumnIndex]);
inputColumnIndex++;
} else {
// replace "NULL" with your default value for
// fields that are not given as input
sqlStatement.append("NULL");
}
if (columnIndex < columnsOfTable)
sqlStatement.append(",");
}
sqlStatement.append(");\n");
}
return sqlStatement.toString();
}
并且,您的示例可以按如下方式执行:
public static void main(String[] args) {
int[] inputColumns = { 2, 4, 5 };
String[][] data = { { "p1", "i1", "g1" }, { "p2", "i2", "g2" } };
String sqlStatement = insertOptional(inputColumns, data);
System.out.println(sqlStatement);
}
这个 main 方法打印出我认为你期望的结果:
INSERT INTO YOUR_TABLE_NAME(NULL,p1,NULL,i1,g1);
INSERT INTO YOUR_TABLE_NAME(NULL,p2,NULL,i2,g2);