Skip to content

Commit 0114f73

Browse files
committed
feat: Add MERGE INTO SQL statement
1 parent 1ca4c83 commit 0114f73

3 files changed

Lines changed: 23 additions & 1 deletion

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ option in the quick command shortcut or in the right click menu.
5252
- `INSERT INTO` - Multiple individual INSERTs
5353
- `DELETE WHERE` - DELETE with WHERE conditions
5454
- `UPDATE WHERE` - UPDATE with WHERE conditions
55+
- `MERGE INTO` - UPDATE or INSERT with data provided
5556
- `CREATE TABLE` - DDL table creation
5657

5758
# Try it Yourself

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@
162162
"INSERT INTO",
163163
"DELETE WHERE",
164164
"UPDATE WHERE",
165+
"MERGE INTO",
165166
"CREATE TABLE"
166167
],
167168
"default": "INSERT INTO VALUES",

src/paste-sql.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ async function clipboardToSql(statement = null) {
2929
"INSERT INTO",
3030
"DELETE WHERE",
3131
"UPDATE WHERE",
32+
"MERGE INTO",
3233
"CREATE TABLE"
3334
];
3435
statement = await vscode.window.showQuickPick(
@@ -44,7 +45,7 @@ async function clipboardToSql(statement = null) {
4445
}
4546

4647
let keyColumns = [];
47-
if (statement === "UPDATE WHERE") {
48+
if (statement === "UPDATE WHERE" || statement === "MERGE INTO") {
4849
keyColumns = await vscode.window.showQuickPick(
4950
tableData.headers,
5051
{
@@ -205,6 +206,23 @@ function createSql(tableData, statement, keyColumns) {
205206
return sql;
206207
}
207208

209+
function getSqlAsMergeInto(rows, cols, keys) {
210+
let unionall = getRowsAsUnionAll(rows, cols);
211+
let onkeys = keys.map(k => `t2.${k} = s1.${k}`).join("\n AND ");
212+
let nonkeys = cols.filter(k => keys.indexOf(k) < 0);
213+
let upset = nonkeys.map(k => ` ${k} = s1.${k}`).join(",\n");
214+
let c1 = cols.join(", ");
215+
let c2 = cols.join(", s1.");
216+
let into = ` INSERT (${c1})\n VALUES (s1.${c2})`;
217+
218+
let sql = `MERGE INTO mytable AS t2 USING(\n${unionall}\n`
219+
+ ` ) AS s1\n ON ${onkeys}\n`
220+
+ `WHEN MATCHED THEN UPDATE SET\n${upset}\n`
221+
+ `WHEN NOT MATCHED THEN\n${into}\n`
222+
+ `WHEN NOT MATCHED BY SOURCE THEN\n DELETE;\n`;
223+
return sql;
224+
}
225+
208226
function getSqlAsInsertFromSelectValues(rows, cols) {
209227
let sql = getSqlAsSelectFromValues(rows, cols);
210228
return `INSERT INTO mytable\n${sql}`;
@@ -257,6 +275,8 @@ function createSql(tableData, statement, keyColumns) {
257275
return getSqlAsDeleteWhere(data, headers);
258276
case "UPDATE WHERE":
259277
return getSqlAsUpdateWhere(data, headers, keyColumns);
278+
case "MERGE INTO":
279+
return getSqlAsMergeInto(data, headers, keyColumns);
260280
case "CREATE TABLE":
261281
return getSqlAsCreateTable(data, headers);
262282
}

0 commit comments

Comments
 (0)