开发者社区> 问答> 正文

将可变长度的数据映射到固定结构的最佳方法?

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

 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“ s”和else“ s”。

问题不仅与这种特定情况有关,而且实际上不是sql或另一种编程语言,而是有关在给定某种形式的定义(例如在这种情况下为索引)的情况下如何将变量输入映射到固定输出的问题。

问题来源:Stack Overflow

展开
收起
montos 2020-03-23 19:08:01 576 0
1 条回答
写回答
取消 提交回答
  • 如果我没有误解您的问题,则希望在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);
        }
    

    这个主要方法完全打印出我认为的期望:

    INSERT INTO YOUR_TABLE_NAME(NULL,p1,NULL,i1,g1);
    INSERT INTO YOUR_TABLE_NAME(NULL,p2,NULL,i2,g2);
    

    回答来源:Stack Overflow

    2020-03-23 19:08:57
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
用计算和数据去改变整个世界 立即下载
重新定义计算的边界 立即下载
低代码开发师(初级)实战教程 立即下载