我正在使用一个带有几个表的SQL数据库,每个表都有大约17万条记录。数据最初都位于单独的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的操作符,两者都是!=,而不是正确的运算符。我需要调整语法吗?
最后,我也希望能够通过'TotSalary‘来订购。问题是查询使用字典排序。“100,000美元”是低于“20,000美元”的工资。
一个站点建议更改列的数据类型(默认情况下它们都是文本)。我尝试将类型更改为数字,然后将整数更改为整数,这两者都不起任何作用。
我也尝试过ORDER BY cast('TotSalary' as int) DESC
,但这也不起作用。
发布于 2018-04-19 05:14:33
我相信以下方法会有效(financial是表名) :-
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);
我尝试将类型更改为数字,然后将整数更改为整数,这两者都不起任何作用。
列类型的影响非常有限,简而言之,任何类型的值都可以保存在任何类型的列中。唯一的限制/限制是rowid列的别名(列类型为INTEGER PRIMARY KEY
或INTEGER PRIMARY KEY AUTOINCREMENT
)只能存储整数。你可能想看看SQLite版本3中的数据类型
https://stackoverflow.com/questions/49921747
复制