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开头,谢谢你指出这一点