2013-05-17 2 views
1

Я использую php 5.3 для своего кода. и я хочу отсортировать данные в следующем формате.Сортировка данных в алфавитно-цифровом порядке с использованием postgresql

под строительство 01 - 101
Building 01 - 150

Строительство 02 - 100
Строительство 02 - 105
здания 03 - 099

public static function fetchSortedPropertyUnits() { 
    $strSql = 'SELECT pu.*,pb.building_name 
       FROM property_units pu 
       LEFT JOIN property_buildings pb ON(pu.property_building_id = pb.id) 
       WHERE pu.management_company_id = ' . $intManagementCompanyId . ' 
        AND pu.property_id = ' . $intPropertyId . ' 
       ORDER BY 
       COALESCE (CAST (SUBSTRING (pb.building_name FROM \'([a-zA-Z ]{1,26})\') AS VARCHAR), \'\'), 
        COALESCE (CAST (SUBSTRING (pb.building_name FROM \'([0-9]{1,10})\') AS INTEGER), 0), 
        COALESCE (CAST (SUBSTRING (pu.unit_number FROM \'([a-zA-Z ]{1,26})\') AS VARCHAR), \'\'), 
        COALESCE (CAST (SUBSTRING (pu.unit_number FROM \'([0-9]{1,10})\') AS INTEGER), 0), 
        pb.building_name, 
        pu.unit_number'; 
      return self::fetchPropertyUnits($strSql, $objDatabase); } 

Это функция выборки я использовал.
& Я использую его в своем коде следующим образом.

$arrobjSortedPropertyUnits = CPropertyUnits::fetchSortedPropertyUnits($this->m_objPropertyUtilitySetting->getManagementCompanyId(), $this->m_objPropertyUtilitySetting->getPropertyId(), $this->m_objClientDatabase); 
foreach($this->m_arrobjPropertyUnits as $objPropertyUnit) { 
    $strUnitNumber = $objPropertyUnit->getUnitNumber(); 
    if(true == valObj($objPropertyUnit, 'CPropertyUnit') && true == $objPropertyUnit->getPropertyBuildingId()) { 
     $strUnitNumber = $objPropertyUnit->getBuildingName() . ' - ' . $objPropertyUnit->getUnitNumber(); 
     $objPropertyUnit->setUnitNumber($strUnitNumber); 
    } 
} 

Я хочу отсортировать его в подходящем порядке, если у собственности нет здания, тогда сортируйте его по номерам единиц. Любая помощь приветствуется по этой проблеме. Благодарю.

+3

Я смущен - имя здания 'Building 01 - 101' является строкой, если вы сортируете по первому числу, а затем второе, и они дополнены, не будет ли лексикографический вид? –

+0

Эти * делают * сортируют в естественном заказе. Пожалуйста, покажите * реальные * базовые данные, из которых вы работаете. Попробуйте http://sqlfiddle.com/. Вы также забыли включить свою версию PostgreSQL. –

+0

Возможно, этот вопрос тоже полезен: http://stackoverflow.com/questions/12965463/humanized-or-natural-number-sorting-of-mixed-word-and-number-strings –

ответ

0

В этом случае вам нужно посмотреть на свои строки и посмотреть, как их обрабатывать. это похоже на строку в виде «Building X - Y», и вы хотите отсортировать по X, а затем Y. Проще всего сделать это, чтобы превратить это в числовой массив. Вы можете сделать это:

..... 
ORDER BY string_to_array(regexp_replace(building_name, 'Building ', ''), ' - ')::int[] 

Это превратит "Building X - Y" в {X, Y} так Строим 1 - 100 становится {1100} и так далее. Они будут упорядочены, начиная с самого левого элемента.