我怎样才能排除某些工资然后订购?
How can I exclude certain salaries and then order by?
我正在使用一个包含多个表的 SQL 数据库,每个表大约有 170,000 条记录。数据最初都在单独的 XLSX 文件中,我将其保存为 CSV,然后导入到 SQLite.
其中一列是 "TotSalary"。我试图用这个专栏做两件事。许多条目似乎已失效,因为 "TotSalary" 是“$0.00”。我想排除工资为 0 的条目。
我试过:
WHERE (other conditions here)
AND (other conditions here)
AND 'TotSalary' IS NOT '[=10=].00'
以及
WHERE (other conditions here)
AND (other conditions here)
AND 'TotSalary' != '[=11=].00'
这些都不起作用。如果我说 'TotSalary' = '$0.00',查询 returns 没有记录,所以不知何故我没有正确定位该值。我查看了 SQLite 的运算符, != 和 NOT 都是正确的运算符。我需要调整任何语法吗?
最后,我也希望能够 ORDER BY 'TotSalary'。问题是查询使用的是字典顺序。订购时,“100,000 美元”的薪水低于“20,000 美元”的薪水。
一个站点建议更改列的数据类型(默认情况下它们都是文本)。我尝试将类型更改为 NUMERIC,然后是 INTEGER,但两者都没有任何区别。
我也试过ORDER BY cast('TotSalary' as int) DESC
,但这也没用。
我相信以下内容会起作用(金融 是 table 名称):-
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);
- 请注意,假设工资永远不会为负。
I tried changing the type to NUMERIC, and then INTEGER, neither of
which made any difference.
列类型的影响非常有限,总之任何类型的值都可以保存在任何类型的列中。唯一的limitation/restriction是rowid列(列类型为INTEGER PRIMARY KEY
或INTEGER PRIMARY KEY AUTOINCREMENT
)的别名只能存储整数。
你不妨看看Datatypes In SQLite Version 3
我正在使用一个包含多个表的 SQL 数据库,每个表大约有 170,000 条记录。数据最初都在单独的 XLSX 文件中,我将其保存为 CSV,然后导入到 SQLite.
其中一列是 "TotSalary"。我试图用这个专栏做两件事。许多条目似乎已失效,因为 "TotSalary" 是“$0.00”。我想排除工资为 0 的条目。
我试过:
WHERE (other conditions here)
AND (other conditions here)
AND 'TotSalary' IS NOT '[=10=].00'
以及
WHERE (other conditions here)
AND (other conditions here)
AND 'TotSalary' != '[=11=].00'
这些都不起作用。如果我说 'TotSalary' = '$0.00',查询 returns 没有记录,所以不知何故我没有正确定位该值。我查看了 SQLite 的运算符, != 和 NOT 都是正确的运算符。我需要调整任何语法吗?
最后,我也希望能够 ORDER BY 'TotSalary'。问题是查询使用的是字典顺序。订购时,“100,000 美元”的薪水低于“20,000 美元”的薪水。
一个站点建议更改列的数据类型(默认情况下它们都是文本)。我尝试将类型更改为 NUMERIC,然后是 INTEGER,但两者都没有任何区别。
我也试过ORDER BY cast('TotSalary' as int) DESC
,但这也没用。
我相信以下内容会起作用(金融 是 table 名称):-
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);
- 请注意,假设工资永远不会为负。
I tried changing the type to NUMERIC, and then INTEGER, neither of which made any difference.
列类型的影响非常有限,总之任何类型的值都可以保存在任何类型的列中。唯一的limitation/restriction是rowid列(列类型为INTEGER PRIMARY KEY
或INTEGER PRIMARY KEY AUTOINCREMENT
)的别名只能存储整数。
你不妨看看Datatypes In SQLite Version 3