如何使用 PHP 和 PostgreSQL 将 String 转换为 Int

问题描述 投票:0回答:1

我正在使用一个用 php 编写的 api,它从 postgres 数据库获取数据。然而,数据字段之一由查询按字典顺序返回。因此我想尝试将其转换为整数。如果这是错误的,请建议我替代方法。这是相关的代码片段

case( 'location_group' ):
                $filter_label_column = 'location_group_' . $pk_location_group_type . '_name';

                if( !is_missing_or_empty( $request['params'], 'filter_label' ) )
                {
                    $filter_label_column = 'location_group_' . $pk_location_group_type . '_' . $request['params']['filter_label'];
                }

                $query->select( [ $filter . "_$pk_location_group_type", 'pk' ], [ $filter_label_column, 'label' ] )
                    ->group( $filter . "_$pk_location_group_type", $filter_label_column )
                    ->order( 'label', 'asc' );
                break;

`

尝试以多种方式进行转换,结果没有为标签返回任何数据,尝试以下操作(还尝试将 SIGNED 替换为 INTEGER):

`case 'location_group':
    $filter_label_column = 'location_group_' . $pk_location_group_type . '_name';

    if (!is_missing_or_empty($request['params'], 'filter_label')) {
        $filter_label_column = 'location_group_' . $pk_location_group_type . '_' . $request['params']['filter_label'];
    }

    $query->select([$filter . "_$pk_location_group_type", 'pk'], ["CAST($filter_label_column AS SIGNED)", 'label'])
        ->group($filter . "_$pk_location_group_type", "CAST($filter_label_column AS SIGNED)")
        ->order('label', 'asc');
    break;`
php postgresql sorting casting lexicographic
1个回答
0
投票

当您想要将按字典顺序排序的字段视为整数时,使用

CAST
将字段转换为整数应该可以在大多数情况下工作。但是,如果它没有返回预期结果,您可以尝试以下一些操作:

  1. 使用

    ::integer
    进行 Postgres 转换:

    您可以使用

    CAST
    在 Postgres 中进行转换,而不是使用
    ::integer
    。尝试以下代码:

    $query->select([$filter . "_$pk_location_group_type", 'pk'], ["$filter_label_column::integer", 'label'])
        ->group($filter . "_$pk_location_group_type", "$filter_label_column::integer")
        ->order('label', 'asc');
    
  2. 检查无效数据:

    验证您尝试转换为整数的列中的数据是否有效并且可以转换为整数。如果列中存在非数字字符或无效数据,转换可能无法按预期进行。

  3. 调试 SQL 查询:

    您可以打印或记录生成的 SQL 查询以查看转换是否正确完成。这可以帮助您识别 SQL 语句本身的任何问题。例如:

    $sql = $query->toSql();
    echo $sql;
    
  4. 查看数据库中的实际数据:

    确保数据库中的数据是您所期望的。有时,问题可能与数据质量或数据在数据库中的存储方式有关。

  5. 考虑使用

    CASE
    进行条件转换:

    如果列中的数据并不总是数字,您可以在适当的时候使用

    CASE
    语句有条件地将其转换为整数。例如:

    $query->select([$filter . "_$pk_location_group_type", 'pk'], [
        DB::raw("CASE WHEN $filter_label_column ~ E'^\\d+$' THEN $filter_label_column::integer ELSE $filter_label_column END"),
        'label'
    ])
    ->group($filter . "_$pk_location_group_type", [
        DB::raw("CASE WHEN $filter_label_column ~ E'^\\d+$' THEN $filter_label_column::integer ELSE $filter_label_column END")
    ])
    ->order('label', 'asc');
    

    此代码使用正则表达式来检查该值是否为数字,然后再将其转换为整数。

通过尝试这些方法并检查数据和 SQL 查询,您应该能够有效地将字段转换为整数并获得所需的结果。

© www.soinside.com 2019 - 2024. All rights reserved.