字符串转整型并排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a, const void *b)//返回值是整型的
{
    return *(int *)a- *(int *)b; //注意是 (int *) a
}
int main()
{
    char str[1005];
    int a[1005];
    while(scanf("%s",str)!=EOF)
    {
        int l = strlen(str);
        int count = 0;
        int i;
        int num = 0;
        int ant;
        if(str[l-1]!='5')
            str[l] = '5'; //最后执行a[count++] = num; 循环结束前赋值
        for(i=0; i<=l; i++)
        {
            if(str[i]!='5')
            {
                num = num*10+str[i]-'0';// eg: str[i]='3','3'-'0'=3
                ant = 0;
            }
            else if(ant==1) continue;//判断str[i]不是连续的'5',若是连续的,数组a[count] no ++
            else
            {
                a[count++] = num;
                ant = 1;
                num = 0;
            }
        }
        qsort(a, count, sizeof(int), cmp);
        printf("%d",a[0]);
        for(i=1; i<count; i++)
            printf(" %d",a[i]);
        printf("\n"); 
    }
    return 0;
}
<think>我们正在处理一个SQL查询问题:用户希望将字符串类型的列转换整数类型,按数值大小排序。根据引用[1][2][3],常见的数据库系统(如MySQL、SQLServer、PostgreSQL)都提供了CAST或CONVERT函数来实现字符串到数字的转换。用户的具体需求是“将SQL中的字符串转换整型进行排序”,因此我们需要给出通用的SQL语句示例,注意不同数据库的语法可能略有不同。步骤:1.确认字符串列的内容是数字字符串(如"123"),否则转换可能会出错(例如包含非数字字符)。2.使用CAST或CONVERT函数将字符串转换整数类型(或数值类型)。3.在ORDERBY子句中使用转换后的结果进行排序。针对不同数据库的示例:一、MySQL:在MySQL中,可以使用CAST(column_nameASUNSIGNED)转换为无符号整数,或者使用CAST(column_nameASSIGNED)转换为有符号整数。也可以使用CONVERT(column_name,UNSIGNED)或CONVERT(column_name,SIGNED)。示例:```sqlSELECT*FROMyour_tableORDERBYCAST(your_columnASUNSIGNED);```或者:```sqlSELECT*FROMyour_tableORDERBYCONVERT(your_column,UNSIGNED);```二、SQLServer:在SQLServer中,可以使用CAST(column_nameASINT)或CONVERT(INT,column_name)。示例:```sqlSELECT*FROMyour_tableORDERBYCAST(your_columnASINT);```或者:```sqlSELECT*FROMyour_tableORDERBYCONVERT(INT,your_column);```三、PostgreSQL:PostgreSQL支持CAST(column_nameASINTEGER)或者更简洁的column_name::INTEGER。示例:```sqlSELECT*FROMyour_tableORDERBYCAST(your_columnASINTEGER);```或者:```sqlSELECT*FROMyour_tableORDERBYyour_column::INTEGER;```注意事项:1.如果字符串列中包含非数字字符(如字母、符号等),转换会失败(在查询执行时报错)。因此,在转换前最好确保数据是有效的数字字符串,或者使用错误处理机制(如SQLServer的TRY_CAST,MySQL可以使用正则表达式先过滤,PostgreSQL可以使用正则表达式或TRY_CAST)。2.如果字符串列中包含小数,转换整数会截断小数部分(或四舍五入,取决于数据库),但用户要求转换整数,所以小数部分会被舍弃。如果希望保留小数部分,应转换为浮点数或小数类型,但用户明确要求整数。针对可能存在的非数字字符问题,我们可以给出一些处理建议:-在转换前先筛选出数字字符串(例如,使用正则表达式或函数检查是否全是数字)。-使用数据库提供的安全转换函数(如MySQL的`CAST(column_nameASUNSIGNED)`在遇到非数字字符时会返回0产生警告,但实际行为可能因版本而异;SQLServer有TRY_CAST,如果转换失败则返回NULL;PostgreSQL有`your_column::INTEGER`在遇到非数字字符时会报错,但可以使用`CAST(your_columnASINTEGER)`,或者使用正则表达式过滤)。例如,在SQLServer中可以使用TRY_CAST避免转换失败导致整个查询失败:```sqlSELECT*FROMyour_tableORDERBYTRY_CAST(your_columnASINT);```在MySQL中,可以使用正则表达式先过滤:```sqlSELECT*FROMyour_tableWHEREyour_columnREGEXP'^[0-9]+$'ORDERBYCAST(your_columnASUNSIGNED);```在PostgreSQL中,可以使用正则表达式过滤:```sqlSELECT*FROMyour_tableWHEREyour_column~'^[0-9]+$'ORDERBYyour_column::INTEGER;```总结:用户需要根据自己使用的数据库系统选择合适的转换函数,注意数据清洗,以避免转换错误。根据用户之前的上下文,他可能是在使用MySQL(因为引用[1]和[2]都提到了MySQL,且引用[1]中标注了“亲测有效”),但为了全面性,我们给出多种数据库的示例。因此,回答如下:</think>### SQL 字符串整型按数值排序的方法 在 SQL 中处理数字字符串排序时,必须显式转换为数值类型才能实现正确的数值排序。以下是针对不同数据库的解决方案: #### 1️⃣ **通用 CAST/CONVERT 方法** ```sql -- MySQL/PostgreSQL/SQLite SELECT * FROM table ORDER BY CAST(string_column AS UNSIGNED); -- MySQL无符号整数 -- SQL Server SELECT * FROM table ORDER BY CAST(string_column AS INT); -- SQL Server整型 -- PostgreSQL (替代语法) SELECT * FROM table ORDER BY string_column::INTEGER; -- 类型转换运算符 ``` > 📌 关键点:使用 `CAST(列 AS 数值类型)` 显式转换字符串列[^1][^2] #### 2️⃣ **处理空值和非数字字符** ```sql -- SQL Server 安全转换 (2012+) SELECT * FROM table ORDER BY TRY_CAST(string_column AS INT) DESC; -- MySQL 过滤非数字 SELECT * FROM table WHERE string_column REGEXP '^[0-9]+$' -- 确保纯数字 ORDER BY CAST(string_column AS UNSIGNED); ``` #### 3️⃣ **浮点数处理** ```sql -- 含小数的字符串 SELECT * FROM table ORDER BY CAST(string_column AS DECIMAL(10,2)); -- 精确小数排序 ``` #### ⚠️ 常见错误场景 1. **字典排序错误** `'100'` 会被排在 `'2'` 前面,因为 `'1' < '2'`(字符比较) ```sql -- 错误结果示例 SELECT '100' AS num UNION SELECT '2' ORDER BY num; -- 结果:100 → 2 ``` 2. **转换失败** 当列包含 `'ABC123'` 等非纯数字时,直接转换会报错,需先用 `TRY_CAST` 或正则过滤 > **最佳实践**:转换前先用 `WHERE column NOT LIKE '%[^0-9]%'` 过滤非数字字符(SQL Server)或 `REGEXP`(MySQL) #### 🌰 实际案例 ```sql -- 员工表 salary_str (varchar) 排序 SELECT employee_id, CAST(salary_str AS DECIMAL(10,2)) AS salary_num FROM employees WHERE ISNUMERIC(salary_str) = 1 -- SQL Server 数字检测 ORDER BY salary_num DESC; -- 正确的数值降 ``` ### 数据库差异总结 | 数据库 | 转换函数 | 安全转换 | 备注 | |--------------|---------------------------|----------------|--------------------------| | **MySQL** | `CAST(x AS UNSIGNED)` | 无 | 需配合 `REGEXP` 过滤 | | **SQL Server**| `CAST(x AS INT)` | `TRY_CAST()` | 2012+版本支持 | | **PostgreSQL**| `x::INTEGER` | `CAST(x AS INT)`| 两种语法等效 | | **Oracle** | `TO_NUMBER(x)` | 无 | 需异常处理 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值