SQLite SELECT ... упорядочение по "лучшему" совпадению - PullRequest
0 голосов
/ 05 марта 2020

Контекст здесь - это база данных SQLCipher в приложении Android. Контекст здесь - это база данных SQLCipher в приложении Android. Контекст здесь - это база данных SQLCipher в приложении Android. Рассмотрим следующую таблицу SQLite

CREATE TABLE IF NOT EXISTS test(a INTEGER NOT NULL,b INTEGER NOT NULL,c INTEGER NOT NULL,d INTEGER NOT NULL);

, в которую я вставляю следующие строки

INSERT INTO test (a,b,c,d) VALUES(1,2,3,4);
INSERT INTO test (a,b,c,d) VALUES(1,2,3,5);
INSERT INTO test (a,b,c,d) VALUES(1,2,5,5);
INSERT INTO test (a,b,c,d) VALUES(1,5,5,5);
INSERT INTO test (a,b,c,d) VALUES(5,5,5,5);

Простой SELECT COUNT(*) FROM test WHERE a = 1 OR b = 2 or c = 3 or d = 4; вернет 4 в результате, так как 4 из 5 строк имеют одно или несколько совпадающих значений. Что мне нужно сделать, так это найти «лучшее» соответствие, то есть то, которое удовлетворяет большинству WHERE .. OR условий. В данном случае это вернет первую строку, где совпадают все четыре столбца. Хотя я мог просто вернуть курсор на необработанный выбор по строкам SELECT * FROM test WHERE a = 1 OR b = 2 or c = 3 or d = 4;, а затем сделать все остальное в Java, мне интересно, нет ли способа сделать это непосредственно в самом SQLite.

1 Ответ

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

Используйте выражение:

(a=1) + (b=2) + (c=3) + (d=4)

в предложении ORDER BY:

SELECT *
FROM test
ORDER BY (a=1) + (b=2) + (c=3) + (d=4) DESC
LIMIT 1

Каждый из терминов: (a=1), (b=2), (c=3) и (d=4) оценивается как 1 для TRUE или 0 для FALSE. Смотрите демо . Если вам нужны связи в результатах, используйте CTE:

WITH cte AS (
  SELECT *, (a=1) + (b=2) + (c=3) + (d=4) counter
  FROM test
)
SELECT a, b, c, d 
FROM cte
WHERE counter = (SELECT MAX(counter) FROM cte)

См. demo . Или с RANK() оконной функцией:

WITH cte AS (
  SELECT *, RANK() OVER (ORDER BY (a=1) + (b=2) + (c=3) + (d=4) DESC) rn
  FROM test
)
SELECT a, b, c, d 
FROM cte
WHERE rn = 1

См. demo . Результаты:

| a   | b   | c   | d   |
| --- | --- | --- | --- |
| 1   | 2   | 3   | 4   |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...