diff --git a/packages/nodes-base/nodes/Postgres/v2/actions/common.descriptions.ts b/packages/nodes-base/nodes/Postgres/v2/actions/common.descriptions.ts index d737758399..c7b9e932c3 100644 --- a/packages/nodes-base/nodes/Postgres/v2/actions/common.descriptions.ts +++ b/packages/nodes-base/nodes/Postgres/v2/actions/common.descriptions.ts @@ -250,6 +250,14 @@ export const whereFixedCollection: INodeProperties = { name: 'Not Equal', value: '!=', }, + { + name: 'In', + value: 'IN', + }, + { + name: 'Not In', + value: 'NOT IN', + }, { name: 'Like', value: 'LIKE', diff --git a/packages/nodes-base/nodes/Postgres/v2/helpers/interfaces.ts b/packages/nodes-base/nodes/Postgres/v2/helpers/interfaces.ts index 0cd3cfdb74..93231ea84a 100644 --- a/packages/nodes-base/nodes/Postgres/v2/helpers/interfaces.ts +++ b/packages/nodes-base/nodes/Postgres/v2/helpers/interfaces.ts @@ -5,11 +5,15 @@ import type pg from 'pg-promise/typescript/pg-subset'; export type QueryMode = 'single' | 'transaction' | 'independently'; -export type QueryValue = string | number | IDataObject | string[]; +export type QueryValue = string | number | IDataObject | string[] | number[]; export type QueryValues = QueryValue[]; export type QueryWithValues = { query: string; values?: QueryValues; options?: IFormattingOptions }; -export type WhereClause = { column: string; condition: string; value: string | number }; +export type WhereClause = { + column: string; + condition: string; + value: string | number | string[] | number[]; +}; export type SortRule = { column: string; direction: string }; export type ColumnInfo = { column_name: string; diff --git a/packages/nodes-base/nodes/Postgres/v2/helpers/utils.ts b/packages/nodes-base/nodes/Postgres/v2/helpers/utils.ts index a8caf39c18..7b6cfa8c92 100644 --- a/packages/nodes-base/nodes/Postgres/v2/helpers/utils.ts +++ b/packages/nodes-base/nodes/Postgres/v2/helpers/utils.ts @@ -170,20 +170,57 @@ export function addWhereClauses( clause.value = value; } - const columnReplacement = `$${replacementIndex}:name`; - values.push(clause.column); - replacementIndex = replacementIndex + 1; - let valueReplacement = ''; - if (clause.condition !== 'IS NULL' && clause.condition !== 'IS NOT NULL') { - valueReplacement = ` $${replacementIndex}`; + let formattedClause = ''; + + if (['IN', 'NOT IN'].includes(clause.condition)) { + if (!Array.isArray(clause.value)) { + throw new NodeOperationError( + node, + `Operator in entry ${index + 1} of 'Select Rows' works with arrays, but value ${ + clause.value + } is not an array`, + { + itemIndex, + }, + ); + } + if (clause.value.length > 0) { + const columnReplacement = `$${replacementIndex}:name`; + values.push(clause.column); + replacementIndex = replacementIndex + 1; + + const valueReplacement = "(" + clause.value + .map((_, idx) => `$${replacementIndex + idx}`) + .join(', ') + ")"; + values.push(...clause.value); + replacementIndex += clause.value.length; + + formattedClause = `${columnReplacement} ${clause.condition} ${valueReplacement}`; + } else { + formattedClause = '1 = 0' + } + } else if (['IS NULL', 'IS NOT NULL'].includes(clause.condition)) { + const columnReplacement = `$${replacementIndex}:name`; + values.push(clause.column); + replacementIndex = replacementIndex++; + + formattedClause = `${columnReplacement} ${clause.condition}`; + } else { + const columnReplacement = `$${replacementIndex}:name`; + values.push(clause.column); + replacementIndex++; + + const valueReplacement = `$${replacementIndex}`; values.push(clause.value); - replacementIndex = replacementIndex + 1; + replacementIndex++; + + formattedClause = ` ${columnReplacement} ${clause.condition} ${valueReplacement}`; } const operator = index === clauses.length - 1 ? '' : ` ${combineWith}`; - whereQuery += ` ${columnReplacement} ${clause.condition}${valueReplacement}${operator}`; + whereQuery += ` ${formattedClause}${operator}`; }); return [`${query}${whereQuery}`, replacements.concat(...values)];