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

How to cast String to Int using PHP with PostgreSQL

提问人:Humza 提问时间:10/21/2023 最后编辑:mickmackusaHumza 更新时间:10/21/2023 访问量:69

问:

我正在使用用 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 强制转换 整数

评论

0赞 KIKO Software 10/21/2023
在您的数据库中使用 PostgreSQL 的数字日期类型之一作为“标签”不是很有意义吗?
0赞 Humza 10/21/2023
@KIKOSoftware我什至不确定它是否尚未作为字符串存储在数据库中。我猜它不是基于显示的行为。不幸的是,由于某种原因,我现在无法访问数据库。你建议做什么
0赞 Pepe N O 10/21/2023
试试这个方法$query->select([$filter . "_$pk_location_group_type", 'pk'], [new \yii\db\Expression("CAST($filter_label_column AS SIGNED)"), 'label']) ->group($filter . "_$pk_location_group_type", new \yii\db\Expression("CAST($filter_label_column AS SIGNED)")) ->order('label', 'asc');
0赞 mickmackusa 10/21/2023
请不要评论“试试这个”的答案。

答:

0赞 Muhammad Sarmad 10/21/2023 #1

您似乎希望将 PostgreSQL 查询中的列转换为整数,以便以数字格式接收数据,但示例代码使用了 PHP 的 SQL 构造工具,而不是实际执行查询。在 PostgreSQL 中将列转换为整数的正确方法如下:

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 INTEGER)",
        'label'
    ])->group($filter . "_$pk_location_group_type", "CAST($filter_label_column AS INTEGER)")
    ->order('label', 'asc');
    break;

在此代码中,您已使用该函数将 转换为整数,这是正确的。不过,用于铸造而不是 。CAST$filter_label_columnAS INTEGERAS SIGNED

验证 中的信息是否实际上是一个字符串,如果此函数的结果与预期结果不匹配,则可以将其转换为整数。如果列中存在非整数,则可能需要以不同的方式处理它们,例如通过过滤掉它们或在非整数值的情况下设置默认值。$filter_label_column