我正在使用一个包含多个表的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美元”。
一个站点建议更改列的数据类型(默认情况下它们都是TEXT)。我尝试将类型更改为NUMERIC,然后更改为INTEGER,这两者都没有任何区别。
我也试过ORDER BY cast('TotSalary' as int) DESC
,但这也不起作用。
答案 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 KEY
或INTEGER PRIMARY KEY AUTOINCREMENT
)只能存储整数。
您可以查看Datatypes In SQLite Version 3