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

问题描述 投票:0回答:2

我试图弄清楚如何使查询在大多数列与查询匹配时返回行。理想情况下,该查询应与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')
mysql sql database postgresql sqlite
2个回答
0
投票

对于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

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

© www.soinside.com 2019 - 2024. All rights reserved.