SQL技术咨询:如何排除0值薪资数据并进行排序?
解决SQLite中排除无效薪资条目并排序的问题
一、搞定TotSalary为$0.00的无效条目过滤
你之前的写法踩了个小坑:用单引号把列名TotSalary括起来了。在SQL里,单引号是用来定义字符串常量的,所以数据库会把'TotSalary'当成一个固定字符串,而不是你要查询的列,这就导致过滤逻辑完全不对。下面给你两种靠谱的解决方式:
情况1:TotSalary是带$符号的字符串类型
直接比较列值和'$0.00'就行,要是担心有NULL值,也可以一起排除:
SELECT * FROM your_table_name WHERE TotSalary IS NOT NULL AND TotSalary != '$0.00';
情况2:转成数值类型过滤(更推荐)
薪资本质是数值,存成字符串会给后续排序添乱(比如$100.00会排在$20.00前面,因为字符串是按字符顺序比的)。可以先去掉$符号再转成数值,这样过滤更精准:
SELECT * FROM your_table_name WHERE CAST(REPLACE(TotSalary, '$', '') AS REAL) > 0;
这里REPLACE(TotSalary, '$', '')负责去掉$符号,CAST(...) AS REAL把字符串转成数值,筛选大于0的条目自然就排除了$0.00。
二、给数据做排序
在查询语句末尾加上ORDER BY子句就行,结合上面的过滤条件,分两种场景:
字符串类型排序(仅作参考,不推荐)
如果暂时不想改列类型,直接按字符串排序:
SELECT * FROM your_table_name WHERE TotSalary != '$0.00' ORDER BY TotSalary ASC; -- ASC是升序(从低到高),换成DESC就是降序(从高到低)
数值类型排序(推荐,结果更合理)
用转换后的数值排序,薪资的顺序才符合我们的直觉:
SELECT *, CAST(REPLACE(TotSalary, '$', '') AS REAL) AS NumericSalary FROM your_table_name WHERE CAST(REPLACE(TotSalary, '$', '') AS REAL) > 0 ORDER BY NumericSalary DESC; -- 按薪资从高到低排序
额外优化建议
如果之后经常要操作这个列,不如直接修改表结构,把TotSalary改成数值类型,省得每次都要转换:
-- 先添加一个数值类型的新列 ALTER TABLE your_table_name ADD COLUMN Salary REAL; -- 把原列的数值转过去 UPDATE your_table_name SET Salary = CAST(REPLACE(TotSalary, '$', '') AS REAL); -- 要是不需要原字符串列了,可以删掉它 ALTER TABLE your_table_name DROP COLUMN TotSalary;
这样后续查询、过滤、排序都会更高效,也少了很多重复操作。
内容的提问来源于stack exchange,提问作者InterLinked
相关产品推荐
相关产品推荐

