我试图弄清楚如何进行查询,以便在大多数列与查询匹配时返回行。 理想情况下,该查询应与PostgreSQL兼容。 (如果它足够基础,那么我可以在SQLite中对其进行本地测试,那将是非常棒的!但这不是必须的。)
我在这里找到了类似的线程,但查询仅与Oracle数据库兼容。
关于如何最有效地实现这一想法?
示例表:
col1|col2|col3
A | B | B
Y | Y | Y
X | B | X
Y | B | B
查询将查找col1 = A且col2 = B且col3 = B的列。
我想要获得的输出:
col1|col2|col3
A | B | B
Y | B | B
为SQLite创建表架构
CREATE TABLE "t" (
"col1" TEXT,
"col2" TEXT,
"col3" TEXT
);
样本数据:
INSERT INTO 't' (col1, col2, col3)
VALUES ('A', 'B', 'B'),
('Y', 'B', 'B'),
('X', 'B', 'X'),
('A', 'B', 'X'),
('Y', 'Y', 'Y')
答案 0 :(得分:1)
对于PostgreSQL,WHERE
子句中的每个条件都可以被评估为TRUE
为1或FALSE
为0,因此您可以这样做:
select * from tablename
where (col1 = 'A')::int + (col2 = 'B')::int + (col3 = 'B')::int +
............................................
>= 9
对于MySql或SQLite,它甚至更简单:
select * from tablename
where (col1 = 'A') + (col2 = 'B') + (col3 = 'B') +
............................................
>= 9
答案 1 :(得分:0)
这就是我要做的。创建具有“正确”值的另一个表,并将其命名为answer_key
。然后将其交叉连接到当前表。
SELECT c.*
from candidates c cross join answer_key ak
order by (c.ans1=ak.ans1)::int+(c.ans2=ak.ans2)::int+(c.ans3=ak.ans3)::int desc;
这是一个小提琴:https://www.db-fiddle.com/f/xpGr2MhzFNbF9Lg4ZK7YEu/0