如何排除某些工资然后按顺序排序?

时间:2018-04-19 12:57:48

标签: sql sqlite sql-order-by

我正在使用一个包含多个表的SQL数据库,每个表包含大约170,000条记录。这些数据最初都是在我保存为CSV的单独XLSX文件中,然后导入到SQLite中。

其中一列是“TotSalary”。我想用这个专栏做两件事。许多条目似乎已经不复存在,因为“TotSalary”是“0.00美元”。我想排除薪水为0的条目。

我试过了:

WHERE (other conditions here)
   AND (other conditions here)
   AND 'TotSalary' IS NOT '$0.00'

以及

WHERE (other conditions here)
   AND (other conditions here)
   AND 'TotSalary' != '$0.00'

这些都不起作用。如果我说'TotSalary'='$ 0.00',查询将不返回任何记录,所以不知何故我没有正确地定位该值。我查看了SQLite的运算符,两者都是!=和NOT是正确的运算符。我需要调整任何语法吗?

最后,我希望能够订购'TotSalary'。问题是查询是使用词典排序。订购时“10万美元”的工资低于“20,000美元”。

enter image description here

一个站点建议更改列的数据类型(默认情况下它们都是TEXT)。我尝试将类型更改为NUMERIC,然后更改为INTEGER,这两者都没有任何区别。

我也试过ORDER BY cast('TotSalary' as int) DESC,但这也不起作用。

1 个答案:

答案 0 :(得分:1)

我相信以下内容可行(财务是表名): -

SELECT 
    * 
FROM financial 
WHERE CAST(replace(replace(TotSalary,',',''),'$','') AS REAL) > 0.00 
ORDER BY CAST(replace(replace(TotSalary,',',''),'$','') AS REAL) DESC

这将使用replace功能删除逗号和美元符号。 然后CAST得到一个REAL的数字,允许它与0.00进行比较,从而允许排除0的行。

ORDER使用相同的替换和强制转换来正确排序。

您可以简化上述内容,但需要使用以下代码来增加一列: -

SELECT 
    *, 
    CAST(replace(replace(TotSalary,',',''),'$','') AS REAL) AS cnv 
FROM financial WHERE cnv > 0.00 
ORDER BY cnv DESC

另一种方法可能是转换数据库中的行,从而无需转换列,例如你可以使用: -

UPDATE financial 
    SET TotSalary = CAST(replace(replace(TotSalary,',',''),'$','') AS REAL);
  • 请注意,假设工资永远不会为负数。
  

我尝试将类型更改为NUMERIC,然后将INTEGER更改为   这有什么不同。

列类型的影响非常有限,简而言之,任何类型的值都可以保存在任何类型的列中。唯一的限制/限制是 rowid 列的别名(列类型为INTEGER PRIMARY KEYINTEGER PRIMARY KEY AUTOINCREMENT)只能存储整数。 您可以查看Datatypes In SQLite Version 3