Лучший подход для сопоставления данных переменной длины с фиксированной структурой? - PullRequest
0 голосов
/ 15 марта 2020

Учитывая фиксированную целевую таблицу данных, такую ​​как, например,

 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.

Вопрос не только в этом конкретном случае c, и на самом деле не sql или другом языке программирования, а скорее в том, как отобразить переменные входы к фиксированному выходу дают определение некоторой формы, например, индексы в этом случае.

1 Ответ

2 голосов
/ 16 марта 2020

Если я не понял вашего вопроса, вы хотите сгенерировать последовательность команд INSERT INTO в SQL, чтобы добавить новые кортежи в таблицу, содержащие поля, которые не были переданы во вход вашей программы, с некоторым значением по умолчанию (например, 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...