2013-05-17 185 views
1

我對我的代碼使用php 5.3。我想按以下格式對數據進行排序。使用postgresql對字母數字順序的數據進行排序

建築01 - 101
建築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

我很困惑 - 建築物名稱「建築物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

在這種情況下,你需要看看你的字符串,看看如何處理它們。它看起來像一個字符串形式的「建設X - Y」,你想排序在X然後Y.簡單的事情就是把它變成一個數組數組。你可以這樣做:

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

這會變成 「樓X - Y」 爲{X,Y}所以號樓1 - 100變爲{} 1100等等。這些將從最左邊的元素開始排序。

相關問題