Сортировка строки в БД Access - PullRequest
2 голосов
/ 17 мая 2011

У меня есть БД с полем Версия. Может быть много записей с одной и той же версией версии, поэтому, чтобы извлечь версии, которые я имею, я делаю следующее:

SELECT DISTINCT tblSample.Version
FROM tblSample
ORDER BY tblSample.Version DESC;

Вот пример данных:

tblSample.Version
1.1.1000
1.2.1654
1.15.1223
1.2.1654
1.1.1000

Что я получу после выполнения запроса:

1.2.1654
1.15.1223
1.1.1000

То, что я хочу получить (потому что 15, очевидно,> 2 и 1):

1.15.1223
1.2.1654
1.1.1000

Соответственно, следует учитывать и другие октеты.

Ответы [ 4 ]

2 голосов
/ 17 мая 2011

Сохранить версию в виде 3 числовых полей.

major minor release
    1     1    1000
    1     2    1654
    1    15    1223
    1     2    1654
    1     1    1000

Затем вы можете сгенерировать версию, отсортированную по вашему желанию, с запросом в любое время.

SELECT [major] & "." & [minor] & "." & [release] AS Version_num
FROM [SELECT DISTINCT major, minor, release
FROM tblSample]. AS s
ORDER BY s.major DESC , s.minor DESC , s.release DESC;
2 голосов
/ 17 мая 2011

То, что вы пытаетесь сделать, аналогично сортировке IP-адресов .Вы можете следовать тем же приемам, изложенным в этой статье, чтобы достичь того, чего вы хотите.

2 голосов
/ 17 мая 2011

В основном, если вы хотите sort для x и выполнить distinct для y, вам сначала нужно сделать отличительное (отсюда подзапрос)

Используя следующую функцию (изменено из fredg'sответ в этой теме ) Примечание: функция использует функцию split , которая, я думаю, здесь уместна.

Public Function ParseText(TextIn As String, X) As Variant
    On Error Resume Next
    Dim var As Variant

    var = Split(TextIn, ".", -1)
    ParseText = var(X)

End Function

Вы можете написать эту инструкцию SQL

SELECT  t.Version
FROM 
    ( SELECT Distinct tblSample.Version
      FROM tblSample.Version) t
ORDER BY 
    Cint(ParseText([t.Version],0)) DESC , 
    Cint(ParseText([t.Version],1)) DESC , 
    Cint(ParseText([t.Version],2)) DESC;

Upate Как отметил HansUp.Вы также должны привести к int для правильной сортировки.Вы можете сделать это в SQL (как мой обновленный ответ) или в ParseText и вернуть int

0 голосов
/ 17 мая 2011

Одним из решений было бы следующее: проанализировать полученные строки, чтобы извлечь числовые значения, поставить нулями впереди при необходимости и вывести строку.Например, 1.2.1654 становится 0001.0002.1654 (если вы уверены, что нумерация не будет превышать 4 символов).Код:

Function NormalizeVersion(Inputstring As String) As String
' Creates sortable strings out of version numbers such as 1.6.222
Dim Elements() As String
Dim Counter As Integer
Dim Result As String
Elements = Split(Inputstring, ".")
For Counter = 0 To UBound(Elements)
    Select Case Counter
    Case 0 'First element
        Result = Format(Elements(Counter), "00000")
    Case Else 'Followups
        Result = Result & "." & Right("0000" & Elements(Counter), 5)
    End Select
Next Counter
NormalizeVersion = Result
End Function

(включено улучшение производительности HansUp) Затем вы можете отсортировать по этому.

Напишите функцию VBA, которая сделает это за вас, например, NormalizeVersion, затем вызовите ее в своем запросе., например (воздушный код):

SELECT DISTINCT NormalizeVersion(tblSample.Version)
FROM tblSample
ORDER BY NormalizeVersion(tblSample.Version) DESC;

(код исправлен после комментария)

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