Если 9/10 столбцов совпадают, верните строку. Как это сделать? - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь выяснить, как сделать запрос, который будет возвращать строки, когда большинство столбцов соответствуют запросу. В идеале запрос должен быть PostgreSQL совместимым. (Если бы его было достаточно c, чтобы я мог проверить его локально в 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 ]

1 голос
/ 22 марта 2020

Для 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
0 голосов
/ 22 марта 2020

Вот как я это сделаю. Создайте другую таблицу с «правильными» значениями и назовите ее 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...