SQLite,检查TEXT字段中是否有任何字母字符

时间:2014-01-14 21:17:40

标签: sql sqlite sql-delete

好的,所以我有一个巨大的条目列表,在其中一个列中(为简单起见,我们称之为 num ,这里有一个数字,类似于{{1 (它们的长度和格式都相同),但有时会有类似这样的字段

123456780000

现在,我需要删除 num 列不完全是数字的所有行。 num 的类型是 TEXT ,而不是 INTEGER 。因此,应删除上述示例,而12345678E000 or 12345678H000 则不应删除。

我尝试过两种解决方案,其中一种可以工作,但不够优雅和杂乱,另一种根本不起作用。

我尝试的第一件事是

123456780000

因为根据文档, abs(X)如果给出 TEXT 值并且不可转换为实数,则返回0.0。所以我认为应该让所有“仅限数字”通过并删除带有字符的那些。但它没有做任何事情,它甚至不会删除一行。

我接下来要做的就是

DELETE FROM MY_TABLE WHERE abs(num) == 0.0

这似乎有用,但数据库很大,我不确定哪些字符可以出现,虽然我可以用整个字母表做DELETE FROM MY_TABLE WHERE num LIKE "%A%" OR "%B%" OR "%C%" ,但这感觉不雅和杂乱。我实际上想了解一下SQLite语言。

最后,我的问题是:如何以一种简单的方式解决这个问题?也许我对 abs(X)解决方案做错了,或者还有另一种我不知道/想到的方式?

提前致谢。

编辑: 根据评论我试过"%D%" OR "%E%" OR "%F%" OR ... 它返回以下

SELECT abs(num) FROM MY_TABLE WHERE num like '%A%'

这很奇怪。它似乎已经将字母出现的数字分开了。该文件声称如果它无法将其转换为数字,它将返回0.0。嗯..

1 个答案:

答案 0 :(得分:4)

你可以在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]*'将返回以下三个:

   num
----------
1000A00000
1000B00000
1000c00000

然后,您可以将其转换为相应的DELETE

DELETE 
FROM MY_TABLE
WHERE num GLOB '*[A-Za-z]*'