Как отобразить возрастание или убывание для содержимого, показанного в MySQL - PullRequest
2 голосов
/ 15 февраля 2012

выводится сейчас:

1234/45/67-9
1234/45/67-8
1234/45/67-7
1234/45/67-6
1234/45/67-5
1234/45/67-4
1234/45/67-3
1234/45/67-22
1234/45/67-2
1234/45/67-10
1234/45/67-1
1234/45/67

Требуется вывод:

1234/45/67-22
1234/45/67-10
1234/45/67-9
1234/45/67-8
1234/45/67-7
1234/45/67-6
1234/45/67-5
1234/45/67-4
1234/45/67-3
1234/45/67-2
1234/45/67-1
1234/45/67



SELECT invoiceNo
FROM invoice
WHERE invoiceNo LIKE '1234/45/67%'
ORDER BY invoiceNo DESC

Я хочу, чтобы вывод отображался по убыванию, но он не может отображаться надлежащим образом? как этого добиться?

Ответы [ 4 ]

2 голосов
/ 15 февраля 2012

Если префикс всегда имеет длину 10 символов, вы можете выделить его с помощью substring и преобразовать второй блок в число с помощью cast:

select invoiceno
from invoice
where invoiceno like '1234/45/67%'
order by substring(invoiceno from 1 for 10),
         cast(substring(invoiceno from 11) as decimal);

Приведение второй части к числу приводит к тому, что они сортируются как числа, а не строки, так что -10 идет перед -1, а не наоборот.Если вы всегда будете использовать префикс формы 9999/99/99 в предложении WHERE, вы можете упростить ORDER BY:

select invoiceno
from invoice
where invoiceno like '1234/45/67%'
order by cast(substring(invoiceno from 11) as decimal);
1 голос
/ 15 февраля 2012

Используйте вычисленное вспомогательное поле, приведенное к integer, например:

SELECT invoiceNo, CAST(SUBSTR(invoiceNo FROM 11) AS INT) AS invoiceNumber
FROM invoice
WHERE invoiceNo LIKE '1234/45/67%'
ORDER BY invoiceNumber DESC
0 голосов
/ 15 февраля 2012

Попробуйте этот запрос

SELECT invoiceNo
FROM invoice
ORDER BY cast(substring(invoiceNo from 11) as decimal) ASC
0 голосов
/ 15 февраля 2012

Попробуйте этот запрос -

SELECT * FROM (
  SELECT invoiceNo,
    @third_part:=SUBSTRING_INDEX(invoiceno, '/', -1) tp
  FROM
    invoice
  WHERE
    invoiceNo LIKE '1234/45/67%'
  ) t
ORDER BY
  SUBSTRING_INDEX(tp, '-', 1) * 1 DESC,
  IF (LOCATE('-', tp) = 0, 0, SUBSTRING_INDEX(tp, '-', -1) * 1) DESC
...