好的,所以我有一个庞大的条目列表,并且在其中一列中(为简单起见,我们将其称为 num, 其中有一个数字,例如123456780000(它们的长度和格式都相同),但是有时有些字段看起来像这
123456780000
12345678E000 or 12345678H000
现在,我需要删除 num 列不完全为数字的所有行。 num 的类型是 TEXT ,而不是 INTEGER 。因此,上述示例应删除,而123456780000不应删除。
我尝试了两种解决方案,其中一种有效,但笨拙且混乱,而另一种则根本不起作用。
我尝试的第一件事是
DELETE FROM MY_TABLE WHERE abs(num) == 0.0
因为根据文档,如果给定 TEXT 值且 abs(X) 不能转换为实数,则 abs(X) 恰好返回0.0 。因此,我认为它应该让所有“仅数字”通过并删除其中带有字符的字符。但是它无能为力,甚至也不会删除一行。 __
我尝试的下一件事是
DELETE FROM MY_TABLE WHERE num LIKE "%A%" OR "%B%" OR "%C%"
哪个似乎可行,但是数据库很大,我不确定会出现哪些字符,尽管我只能"%D%" OR "%E%" OR "%F%" OR ...处理整个字母,但感觉却很杂乱。我实际上想学习一些有关SQLite语言的知识。
"%D%" OR "%E%" OR "%F%" OR ...
最后,我的问题是:我该如何以一种很好而简单的方式解决这个问题?也许我的 abs(X) 解决方案出了点问题,还是我不知道/想过的另一种方式?
提前致谢。
编辑:根据我尝试过的评论SELECT abs(num) FROM MY_TABLE WHERE num like '%A%' ,它返回了以下内容
SELECT abs(num) FROM MY_TABLE WHERE num like '%A%'
12345678.0
那很奇怪。似乎已经按字母顺序出现的数字进行了拆分。该文档声称,如果无法将其转换为数字,它将返回0.0。唔..
您可以GLOB在SQLite中使用范围将它们选出来的方法:
GLOB
SELECT * FROM MY_TABLE WHERE num GLOB '*[A-Za-z]*'
将此提琴与它一起使用:http ://sqlfiddle.com/#!7/ 4bc21/10
例如,对于这些记录:
num ---------- 1234567890 0987654321 1000000000 1000A00000 1000B00000 1000c00000
GLOB '*[A-Za-z]*' 将返回以下三个:
GLOB '*[A-Za-z]*'
num ---------- 1000A00000 1000B00000 1000c00000
然后,您可以将其翻译为适当的内容DELETE:
DELETE
DELETE FROM MY_TABLE WHERE num GLOB '*[A-Za-z]*'