преобразование вставки в select

Вы просто переполнили целочисленную арифметику оболочки:

echo $(( 65536 * 65536 * 65536 * 32768 - 1 ))
9223372036854775807
echo $(( 65536 * 65536 * 65536 * 32768 ))
-9223372036854775808

Вы можете использовать инструмент произвольной точности, такой как bc для этого

bc
3*3*3*17*433*613*937*858164002128703934431
97964999429910939982995739699617

Или

echo '3*3*3*17*433*613*937*858164002128703934431' | bc
97964999429910939982995739699617
3
15.11.2017, 20:15
2 ответа

КомплексAWKраствор:

awk -F'[()]' '{ sub(/INSERT INTO */,"",$1); 
                printf "SELECT * FROM %s WHERE ",$1;
                len=split($2, f, ","); split($4, v, ","); 
                for (i=1; i<=len; i++) printf "%s=%s%s", f[i], v[i], (i==len? ";":" AND ");
                print "" 
              }' test_inserts
  • -F'[()]'-разделитель сложных полей
  • sub(/INSERT INTO */,"",$1)-удалить INSERT INTOфразу из 1-го поля (для извлечения таблицы имя)
  • printf "SELECT * FROM %s WHERE ",$1-напечатать начало оператора SQL, содержащего имя таблицы
  • split($2, f, ",")-разделить второе поле с помощью разделителя ,для получения имен полей(fстановится массивом имен полей)
  • split($4, v, ",")-разделить 4-е поле разделителем ,для получения значений поля(vстановится массивом значений полей)

Выход:

SELECT * FROM table1 WHERE field1='values1' AND field2='value2' AND field3='value3';
SELECT * FROM table1 WHERE field1='other_values1' AND field2='other_value2' AND field3='other_value3';
SELECT * FROM table1 WHERE field1='another_values1' AND field2='another_value2' AND field3='another_value3';
SELECT * FROM table2 WHERE table2_field1='table2_values1' AND table2_field2='table2_value2' AND table2_field3='table2_value3' AND field4=;
SELECT * FROM table2 WHERE table2_field1='other_table2_values1' AND table2_field2='other_table2_value2' AND table2_field3='other_table2_value3' AND table2_field4=;
SELECT * FROM table2 WHERE table2_field1='another_table2_values1' AND table2_field2='another_table2_value2' AND table2_field3='another_table2_value3' AND table2_field4='another_table2_value4';
6
27.01.2020, 21:09

Если вам нужны пояснения, скажите, и я добавлю комментарии в код.

Требования:

  1. Количество полей и значений должно совпадать.
  2. Имена полей и значения полей не должны содержать эти символы:,)(;-запятая, круглые скобки, точка с запятой.

gawk '{
    num = patsplit($3$4, arr, /[^,)(;]+/);
    num /= 2;

    printf("SELECT * FROM %s WHERE ", arr[1]);

    for(i = 2; i <= num; i++) {
        printf("%s=%s", arr[i], arr[num + i]);

        printf (i < num) ? " AND " : ";\n";
    }
}' input.txt

Пояснение:

Эта строка выбрана в качестве примера:INSERT INTO table1(field1,field2,field3) VALUES('values1','value2','value3');

  1. num = patsplit($3$4, arr, /[^,)(;]+/);
    • patsplit(s, a, r)-разделяет строку s на массив a по регулярному выражению r и возвращает количество полей.
    • $3$4-$3— это table1(field1,field2,field3), $4— это VALUES('values1','value2','value3');. Итак, после объединения у нас есть эта строка:table1(field1,field2,field3)VALUES('values1','value2','value3');.
    • затем разделите его на arrэтим регулярным выражением /[^,)(;]+/. Это означает :все символы, кроме запятой, круглых скобок и точки с запятой. Следовательно, теперь:arr[1]— это table1, arr[2]— это field1, arr[5]— это VALUESи так далее.
  2. num /= 2;для алгоритма, используемого в этом скрипте, требуется половина переменной num.
  3. printf("SELECT * FROM %s WHERE ", arr[1]);-напечатать первый элемент arr, который является именем таблицы. В нашем случае это table1.
  4. printf("%s=%s", arr[i], arr[num + i]);-Алгоритм. Выведите один элемент из первой половины arrи соответствующий элемент из второй половины arr. То есть arr[2]и arr[6], arr[3]и arr[7], arr[4]и arr[8].
  5. printf (i < num) ? " AND " : ";\n";-Тернарный оператор. Если это не последняя итерация, выведите AND, иначе выведите;\n(последнюю точку с запятой и новую строку ).

Ввод(Я исправил ваш ввод, так как в нем были ошибки -количество имен полей и значений полей не совпадали ).

INSERT INTO table1(field1,field2,field3) VALUES('values1','value2','value3');
INSERT INTO table1(field1,field2,field3) VALUES('other_values1','other_value2','other_value3');
INSERT INTO table1(field1,field2,field3) VALUES('another_values1','another_value2','another_value3');
INSERT INTO table2(table2_field1,table2_field2,table2_field3,table2_field4) VALUES('table2_values1','table2_value2','table2_value3','table2_value4');
INSERT INTO table2(table2_field1,table2_field2,table2_field3,table2_field4) VALUES('other_table2_values1','other_table2_value2','other_table2_value3','other_table2_value4');
INSERT INTO table2(table2_field1,table2_field2,table2_field3,table2_field4) VALUES('another_table2_values1','another_table2_value2','another_table2_value3','another_table2_value4');

Выход

SELECT * FROM table1 WHERE field1='values1' AND field2='value2' AND field3='value3';
SELECT * FROM table1 WHERE field1='other_values1' AND field2='other_value2' AND field3='other_value3';
SELECT * FROM table1 WHERE field1='another_values1' AND field2='another_value2' AND field3='another_value3';
SELECT * FROM table2 WHERE table2_field1='table2_values1' AND table2_field2='table2_value2' AND table2_field3='table2_value3' AND table2_field4='table2_value4';
SELECT * FROM table2 WHERE table2_field1='other_table2_values1' AND table2_field2='other_table2_value2' AND table2_field3='other_table2_value3' AND table2_field4='other_table2_value4';
SELECT * FROM table2 WHERE table2_field1='another_table2_values1' AND table2_field2='another_table2_value2' AND table2_field3='another_table2_value3' AND table2_field4='another_table2_value4';
1
27.01.2020, 21:09

Теги

Похожие вопросы