【问题标题】:If 9/10 columns match, return the row. How to do that?如果 9/10 列匹配,则返回该行。怎么做?
【发布时间】:2020-07-02 23:04:06
【问题描述】:

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

【问题讨论】:

  • 请在您的问题中添加示例数据。
  • 请相应地阅读sql tag infoedit中的前几段。
  • 我不确定您是如何获得输出的。您是否正在查看 ORDER BY 的匹配数?
  • 为什么要在结果中出现Y | Y | YX | B | X 行?他们不满足条件 9/10?
  • 是的,对不起,他们不应该在那里。顺序很重要。

标签: mysql sql database postgresql sqlite


【解决方案1】:

对于 PostgreSQL,WHERE 子句中的每个条件都可以计算为 1 代表 TRUE 或 0 代表 FALSE,因此您可以这样做:

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

【讨论】:

    【解决方案2】:

    我就是这样做的。使用“正确”值创建另一个表并将其命名为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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2020-01-07
      相关资源
      最近更新 更多