我正在使用一个用 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;`
当您想要将按字典顺序排序的字段视为整数时,使用
CAST
将字段转换为整数应该可以在大多数情况下工作。但是,如果它没有返回预期结果,您可以尝试以下一些操作:
使用
::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');
检查无效数据:
验证您尝试转换为整数的列中的数据是否有效并且可以转换为整数。如果列中存在非数字字符或无效数据,转换可能无法按预期进行。
调试 SQL 查询:
您可以打印或记录生成的 SQL 查询以查看转换是否正确完成。这可以帮助您识别 SQL 语句本身的任何问题。例如:
$sql = $query->toSql();
echo $sql;
查看数据库中的实际数据:
确保数据库中的数据是您所期望的。有时,问题可能与数据质量或数据在数据库中的存储方式有关。
考虑使用
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 查询,您应该能够有效地将字段转换为整数并获得所需的结果。