如果9/10列匹配,则返回该行。怎么做?

时间:2020-03-22 08:45:16

标签: mysql sql database postgresql sqlite

我试图弄清楚如何进行查询,以便在大多数列与查询匹配时返回行。 理想情况下,该查询应与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')

2 个答案:

答案 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