Порядок PostgreSQL Не работает правильно - PullRequest
1 голос
/ 24 сентября 2019

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

сейчас я получаю данные в следующем порядке

1
1
1A
10
10
10A
10A
11A
11A
12A
2
2
2A
cradle-1
cradle-2
cradle-11

Я хочу получить данные в следующем порядке.

1
1
2
2
10
10
1A
2A
10A
10A
11A
11A
12A
cradle-1
cradle-2
cradle-11

нижемой запрос на выборку, из которого я получаю все данные.

select am.audit_ques_id, am.audit_id  ,ddl3.dd_value AS activityName  , am.question_id , 
        ddl2.question AS question, am.answer_type, am.answer_lov, ddl4.dd_value AS answerTypeName, am.ok_notok , 
        ddl5.dd_value AS okNotOkName, am.answer_min, am.answer_max, am.uom, ddl13.dd_value AS uomname, 
        am.correct_ans, am.created_by, am.created_date,ddl6.dd_value AS stage, ddl14.dd_value AS stageno, 
        ddl7.description, ddl8.dd_value AS severity, ddl9.dd_value AS who , ddl10.dd_value AS how , 
        ddl11.dd_value AS "when"  , ddl12.dd_value AS "where" from audit_ques_detail am 
        left join audit_master ddl1 on ddl1.audit_id=am.audit_id
        left join dd_type_details ddl3 on ddl3.dd_id=ddl1.activity_id
        left join question_master ddl2 on ddl2.question_id=am.question_id
        left join dd_type_details ddl4 on ddl4.dd_id = am.answer_type
        left join dd_type_details ddl5 on ddl5.dd_id = am.ok_notok
        left join dd_type_details ddl6 on ddl6.dd_id = ddl2.stage
        left join question_master ddl7 on ddl7.question_id = am.question_id
        left join dd_type_details ddl8 on ddl8.dd_id = ddl2.severity
        left join dd_type_details ddl9 on ddl9.dd_id = ddl2.who
        left join dd_type_details ddl10 on ddl10.dd_id = ddl2.how
        left join dd_type_details ddl11 on ddl11.dd_id = ddl2.when
        left join dd_type_details ddl12 on ddl12.dd_id = ddl2.where
        left join dd_type_details ddl13 on ddl13.dd_id = am.uom
        left join dd_type_details ddl14 on ddl14.dd_id = am.stage_no
        where am.audit_id = 1581 and am.isActive = 1 ORDER BY ddl14.dd_value

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Поскольку вы можете использовать несколько условий сортировки, сначала сортируйте по длине значения, а затем сортируйте по возрастанию.

order by length(ddl14.dd_value), ddl14.dd_value
0 голосов
/ 24 сентября 2019

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

order by substring (ddl14.dd_value from '^\d+')::integer, ddl14.dd_value

- РЕДАКТИРОВАТЬ9/24/2019 -

Опять же, не для поиска кредитов эффективности, но на основе вашего обновленного вопроса это было отсортировано в порядке, который вы просили в данных образца:

order by
  substring (ddl14.dd_value from '^\d+')::integer, 
  substring (ddl14.dd_value from '\D+') nulls first,
  substring (ddl14.dd_value from '\d+$')::integer

Образецвывод:

1
1
2
2
10
10
10A
10A
11A
11A
12A
cradle-1
cradle-2
cradle-11
...