0

给定一个固定的目标数据表,例如

 1      2         3       4      5
 Spain, Portugal, France, Italy, Greece

输入由数据列和启用列的可配置列表组成,例如[1, 4]输入可能只包含Spainand Italy

目的是构建一个 SQL 语句(尽管它本身不是一个 SQL 问题),它只会将输入中可用的列设置到它们的正确位置。

可能的输入:

enabled columns: 2,4,5
data:
    p1    i1    g1
    p2    i2    g2
    .............

尝试以编程方式(在 java 中)而不是在 SQL 中执行此操作,并且不太确定如何避免if's 和else's 的疯狂分支。

问题不仅仅是关于这种特定情况,也不是真正的 sql 或其他编程语言,而是关于如何将变量输入映射到给定某种形式的定义的固定输出,例如这种情况下的索引。

4

1 回答 1

2

如果我没有误解您的问题,您希望在 SQL 中生成一系列 INSERT INTO 命令,以将新元组添加到表中,并使用一些默认值(例如 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);
于 2020-03-15T21:12:05.500 回答