LINUX.ORG.RU

сложная сортировка записей sql

 


0

1

Доброго дня! в бд есть такой набор данных (буквы, разделители находятся в разных местах строки), например:

А5-23-0,25 С8-22-0,18 ОМЛТ-1-В-5,1 M5x13 M8х5 2ГДШ-16 4 2М2-6H.04.013 C2-23-1-1,2 К10-47А-100В-0,22 К10-47А-100В-0,23.

что прописывать в order by, чтобы данные сортировались таким образом (т.е. сортировка была натуральной (5<12), если числа, и по алфавиту):

2ГДШ-16 4 2М2-6H.04.013 А5-23-0,25 К10-47А-100В-0,22 К10-47А-100В-0,25 М5х8 M5x13 M8х5 ОМЛТ-1-В-5,1 C2-23-1-1,2 C2-23-1-11 С8-22-0,18?

всего подобных данных в бд около 11000.


WITH x(t) AS (
    VALUES
     ('10_asdaasda')
    ,('100_inkskabsjd')
    ,('11_kancaascjas')
    ,('45_aksndsialcn')
    ,('22_dsdaskjca')
    ,('100_skdnascbka')
    )
SELECT t
FROM   x
ORDER  BY (substring(t, '^[0-9]+'))::int
          ,substring(t, '[^0-9_].*$')
Jopich1
()
Последнее исправление: Jopich1 (всего исправлений: 1)
Ответ на: комментарий от yats

написала такой скрипт для записей типа: 2х4, 2.2х16.Хим.Окс.прм, М8х80-A4-70: SELECT Stand.*, Gost.Gost_ID AS GostID, Gost.Name AS GostName, Okp.Okp_ID AS OkpID,Okp.Klass,Okp.Naim FROM Standart.dbo.Stand, Standart.dbo.Gost, Standart.dbo.Okp WHERE Stand.Gost_Id=Gost.Gost_Id AND Stand.Okp_Id=Okp.Okp_Id and Stand.Name='Штифт' order by cast(substring(Stand.Mark ,patindex ('%м[0-9]%',Stand.Mark )+1,patindex ('%[^0-9]%',substring(Mark,patindex ('%M[0-9]%',Stand.Mark )+2,2000))) as int), REPLACE(Stand.Mark, '.', 'ц') а для таких: ОМЛТ-0,25-В-7,5 кОм ± 5 %- МТ-0,125-1,6 кОм ± 5 % К10-17-1б-М47-6800 пФ ± 10 %- В .... никак не соображу...

yats
() автор топика

i-пать ... 8-о Ты не указал что за СУБД пользуешь, но надеюсь оно udf умеет. Тогда я бы написал функу вычисляющую «вес» на чём то более подходящем, чем голый SQL и юзал бы уже его для сортировки.

_

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.