2013-05-17 188 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等等。这些将从最左边的元素开始排序。

相关问题