【问题标题】:Sort the data in alphanumeric order using postgresql使用 postgresql 按字母数字顺序对数据进行排序
【发布时间】:2013-05-17 05:30:02
【问题描述】:

我的代码使用 php 5.3。我想按以下格式对我的数据进行排序。

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 );  }

这是我使用的 fetch 函数。
&我在我的代码中使用它如下。

$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 );  
    }  
}  

我想按正确的顺序对其进行排序,如果属性没有建筑物,则仅按单元编号对其进行排序。欢迎对此问题提供任何帮助。谢谢。

【问题讨论】:

  • 我很困惑 - 建筑物名称 Building 01 - 101 是一个字符串,如果您按第一个数字排序,然后是第二个数字,并且它们被填充,字典排序不是吗?跨度>
  • 那些按自然顺序排序。请显示您正在使用的真实基础数据。试试sqlfiddle.com。您还忘记包含您的 PostgreSQL 版本。
  • 您可能会发现这个问题也很有用:stackoverflow.com/questions/12965463/…
  • 这里楼号是字符串,101,即单元号也是varchar类型。
  • 不知道这是否超出了您的项目范围,但您是否考虑过使用像PropelDoctrine 这样的对象关系映射框架来简化此类问题?我是否正确假设建筑物编号和单元编号都存储在不同的列中,都作为 VARCHAR,并且您想输出由它们排序的选择?如果是这样,这将只是类似于 ORDER BY pb.building_name ASC, pu.unit_number ASC。如果其中一个没有值,则结果集仍将按另一个排序。

标签: php postgresql natural-sort


【解决方案1】:

在这种情况下,您需要查看您的字符串并了解如何处理它们。看起来有一个“Building X - Y”形式的字符串,并且您想先按 X 排序,然后按 Y 排序。简单的做法是将其转换为数字数组。你可以这样做:

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

这会将“建筑物 X - Y”变成 {X,Y},因此建筑物 1 - 100 变成 {1,100},依此类推。这些将从最左边的元素开始排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多