Sql 从查询中排除“分组”数据

Sql 从查询中排除“分组”数据,sql,postgresql,node-postgres,Sql,Postgresql,Node Postgres,我有一张表,看起来像这样: CREATE TABLE IF NOT EXISTS records ( user_id uuid NOT NULL ts timestamptz NOT NULL, op_type text NOT NULL, PRIMARY KEY (user_id, ts, op_type) ); 出于实际目的,我无法更改主键 我试图编写一个查询,获取给定用户id的所有记录,其中,对于特定记录,ts和op类型与排除

我有一张表,看起来像这样:

  CREATE TABLE IF NOT EXISTS records (
    user_id   uuid NOT NULL
    ts        timestamptz NOT NULL,
    op_type   text NOT NULL,
    PRIMARY KEY (user_id, ts, op_type)
  );
出于实际目的,我无法更改主键

我试图编写一个查询,获取给定用户id的所有记录,其中,对于特定记录,ts和op类型与排除数组不匹配

我不太确定postgres的术语是否正确,所以让我看看这个例子是否让我的约束更清晰:

此数组在JavaScript中类似如下:

var excludes = [
  [DATE1, 'OP1'],
  [DATE2, 'OP2']
]
对于给定的用户id,如果数据库中有如下行:

             ts             |   op_type   
----------------------------+-------------
 DATE1                      | OP1
 DATE2                      | OP2
 DATE1                      | OP3
 DATE2                      | OP1
 OTHER DATE                 | OP1
 OTHER DATE                 | OP2
然后,使用上面的excludes,我想运行一个查询,返回除或前两行之外的所有内容,因为它们完全匹配

我试图做到这一点:

client.query(`
    SELECT * FROM records
      WHERE
        user_id = $1
        AND (ts, op_type) NOT IN ($2)
`, [userId, excluding])

但我得到的匿名复合类型的输入并没有实现。我不确定如何正确键入排除,或者这是否是正确的方法。

查询可能如下所示

SELECT * 
FROM records
WHERE user_id = 'a0eebc999c0b4ef8bb6d6bb9bd380a11'
AND (ts, op_type) NOT IN (('2016-01-01', 'OP1'), ('2016-01-02', 'OP2'));
因此,如果要将条件作为单个参数传递,则应使用以下格式的字符串:

('2016-01-01', 'OP1'), ('2016-01-02', 'OP2')
似乎没有简单的方法将条件字符串作为参数传递到查询中。您可以尝试编写一个函数以获得正确格式的字符串我不是JS开发人员,但这段代码似乎运行良好:

excluding = function(exc) {
    var s = '(';
    for (var i = 0; i < exc.length; i++)
        s = s+ '(\''+ exc[i][0]+ '\',\''+ exc[i][1]+ '\'),';
    return s.slice(0, -1)+ ')';
};

var excludes = [
    ['2016-01-01', 'OP1'],
    ['2016-01-02', 'OP2']
];

// ...

client.query(
    'SELECT * FROM records '+
    'WHERE user_id = $1 '+
    'AND (ts, op_type) NOT IN ' + excluding(excludes),
    [userId])

这似乎是可行的-有没有关于如何让这样的东西转义正确使用节点postgres的想法?关于我在上面尝试的$1,$2为什么不起作用,你有什么想法吗?@AaronYodaiken那是因为你没有使用$1,$2,你使用了$0,$1,这是不正确的,格式化变量以$1开头。@vitaly-t-这是一个明显的错误,但问题是如何格式化这种表达式并将其正确地传递给查询。上面的示例不已经提供了所有细节吗?使用node postgres有什么问题?@klin不客气!如果你想要一个真正强大的查询格式引擎,那么就去看看吧。没有$0这样的东西,变量在问题中以$1.Typo开头,谢谢你指出这一点