我正在使用一个包含多个表的 SQL 数据库,每个表大约有 170,000 条记录。数据最初都在单独的 XLSX 文件中,我将这些文件保存为 CSV,然后导入到 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”进行订购。问题是查询使用的是字典顺序。订购时,“$100,000”的工资低于“$20,000”。
一个站点建议更改列的数据类型(默认情况下它们都是 TEXT)。我尝试将类型更改为 NUMERIC,然后是 INTEGER,这两者都没有任何区别。
我也尝试过,ORDER BY cast('TotSalary' as int) DESC
但这也不起作用。
我相信以下方法会起作用(财务是表名):-
SELECT
*
FROM financial
WHERE CAST(replace(replace(TotSalary,',',''),'$','') AS REAL) > 0.00
ORDER BY CAST(replace(replace(TotSalary,',',''),'$','') AS REAL) DESC
这将使用该replace
函数删除逗号和美元符号。然后它是CAST
a 的结果数字,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
)只能存储一个整数。您可能希望查看SQLite 版本 3 中的数据类型
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句