Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak porównać ciąg wersji (x.y.z) w MySQL?

Jeśli wszystkie numery wersji wyglądają tak samo:

X
X.X
X.X.X
X.X.X.X

gdzie X jest liczbą całkowitą od 0 do 255 (włącznie), wtedy możesz użyć INET_ATON() funkcja do przekształcenia łańcuchów na liczby całkowite nadające się do porównania.

Zanim jednak zastosujesz funkcję, musisz upewnić się, że argument funkcji ma wartość X.X.X.X formularz, dołączając niezbędną ilość '.0' do niego. Aby to zrobić, musisz najpierw dowiedzieć się, ile . ten ciąg już zawiera, co można zrobić w następujący sposób:

CHAR_LENGTH(ver) - CHAR_LENGTH(REPLACE(ver, '.', '')

Oznacza to, że liczba kropek w ciągu to długość ciągu pomniejszona o jego długość po usunięciu kropek.

Otrzymany wynik należy następnie odjąć od 3 i wraz z '.0' , przekazany do REPEAT() funkcja:

REPEAT('.0', 3 - CHAR_LENGTH(ver) + CHAR_LENGTH(REPLACE(ver, '.', ''))

To da nam podłańcuch, który musi być dołączony do oryginalnego ver wartość, aby była zgodna z X.X.X.X format. Tak więc zostanie on z kolei przekazany do funkcji CONCAT() działać wraz z ver . I wynik tego CONCAT() można teraz bezpośrednio przekazać do INET_ATON() . Oto, co ostatecznie otrzymujemy:

INET_ATON(
  CONCAT(
    ver,
    REPEAT(
      '.0',
      3 - CHAR_LENGTH(ver) + CHAR_LENGTH(REPLACE(ver, '.', ''))
    )
  )
)

I to tylko dla jednej wartości! :) Podobne wyrażenie powinno być skonstruowane dla drugiego ciągu, po czym możesz porównać wyniki.

Referencje:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Policz wiersze w bazie danych mysql, w których znacznik czasu znajduje się w przedziale X

  2. wybrani użytkownicy mają więcej niż jeden odrębny rekord w mysql

  3. Zrozumienie dziennika audytu ProxySQL

  4. Hibernacja OneToOne leniwe ładowanie i kaskadowanie

  5. Łączenie się z instancją Amazon RDS przez instancję EC2 za pomocą MySQL Workbench