好的,所以我有一个巨大的条目列表,在其中一列中(为简单起见,我们称之为 num 有一个数字,类似于 123456780000
(它们的长度和格式都相同),但有时会有这样的字段
12345678E000
or
12345678H000
现在,我需要删除所有 num 列不完全是数字的行。 num 的类型是TEXT,而不是INTEGER。所以上面的例子应该删除,而 123456780000
不应该。
我尝试了两种解决方案,其中一种可行但不雅且凌乱,另一种根本行不通。
我首先尝试的是
DELETE FROM MY_TABLE WHERE abs(num) == 0.0
因为根据文档,如果给定 TEXT 值且无法转换为实数,abs(X) 将准确返回 0.0。所以我在想它应该让所有“仅限数字”通过并删除其中包含字符的那些。但它什么也没做,它甚至没有删除一行。
接下来我尝试的是
DELETE FROM MY_TABLE WHERE num LIKE "%A%" OR "%B%" OR "%C%"
这似乎可行,但数据库很大,我不确定可以出现哪些字符,虽然我可以这样做 "%D%"OR "%E%"OR "%F%"OR ...
对于整个字母表,这感觉既不优雅又凌乱。我实际上想学习一些有关 SQLite 语言的知识。
最后,我的问题是:如何以一种简单明了的方式解决这个问题?也许我在 abs(X) 解决方案上做错了什么,或者还有其他我不知道/没想到的方法?
提前致谢。
编辑:
根据评论,我尝试了 SELECT abs(num) FROM MY_TABLE WHERE num like '%A%'
并返回以下内容
12345678.0
这很奇怪。似乎它已经拆分了字母出现的数字。该文档声称如果无法将其转换为数字,它将返回 0.0。嗯..
最佳答案
您可以在 SQLite 中使用带有范围的 GLOB
来将它们挑出来:
SELECT *
FROM MY_TABLE
WHERE num GLOB '*[A-Za-z]*'
看看它在这个 fiddle 中的使用: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]*'
关于SQLite,检查文本字段中是否有任何字母字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21124212/