У меня есть таблица, которая используется для хранения совместимости для определенной версии программного обеспечения. Например, совместима ли версия клиента с бэкэнд. Существует нижняя и верхняя граница, у обоих есть номера основных, второстепенных и версий версий. Номера с верхней границей могут быть нулевыми (существует контрольное ограничение, которое гарантирует, что либо все, либо ни одно из них не равно нулю).Сравнение номеров версий в запросе SQL
Я хотел бы создать запрос, который возвращает строки для различных MajorVersion, MinorVersion и revisionVersion чисел. Пример (ClientId налево, чтобы сделать его более простым):
minMajorVersion | minMinorVersion | minRevisionVersion | maxMajorVersion | maxMinorVersion | maxRevisionVersion
1 0 0 NULL NULL NULL
1 2 5 NULL NULL NULL
1 3 0 NULL NULL NULL
2 0 1 5 1 0
Допустим, я хочу знать, какая версия клиента совместима с серверной версии 1.2.6. Для этого запрос должен возвращать первые две строки, потому что минимальные версии меньше, а максимальные версии - NULL. Для другой бэкэнд-версии 2.0.1 запрос должен возвращать последнюю строку, а для бэкэнд-версии 5.2.0 запрос ничего не должен возвращать.
То, что я был в состоянии создать это:
SELECT c.* FROM COMPATIBILITYQUALIFIER q
join client c on (c.id = q.clientid)
WHERE (q.MINBACKENDMAJORVERSION < 2
OR (q.MINBACKENDMAJORVERSION = 2 AND q.MINBACKENDMINORVERSION < 3)
OR (q.MINBACKENDMAJORVERSION = 2 AND q.MINBACKENDMINORVERSION = 3 AND q.MINBACKENDREVISIONVERSION <=6))
AND ((q.MAXBACKENDMAJORVERSION IS NULL)
OR ((q.MAXBACKENDMAJORVERSION > 2)
OR (q.MAXBACKENDMAJORVERSION = 2 AND q.MAXBACKENDMINORVERSION > 3)
OR (q.MAXBACKENDMAJORVERSION = 2 AND q.MAXBACKENDMINORVERSION = 3 AND q.MAXBACKENDREVISIONVERSION >= 6)))
order by c.MAJORVERSION DESC, c.MINORVERSION DESC, c.REVISIONVERSION DESC;
Я не думаю, что это будет производительным. Простым способом сделать это будет создание хранимой процедуры, но я не хочу сейчас вводить код в базу данных.
Есть ли способ сделать это с помощью подзапросов? Что-нибудь еще, что быстро?
ОБНОВЛЕНО.
Без фактической таблицы + определения данных + запросы, которые вы пробовали, трудно дать правильный ответ. – sstan
Ваши требования не ясны. Просьба предоставить образцы данных и лучшее описание проблемы, которую вы пытаетесь решить. – Sentinel
@sstan Спасибо, вы оба правы. жаль, что я немного устал, когда задал вопрос. Теперь я обновил его, пожалуйста, взгляните еще раз. –