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

标签 sql sqlite sql-delete

好的,所以我有一个巨大的条目列表,在其中一列中(为简单起见,我们称之为 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/

相关文章:

c# - C# 如何获取更新记录的ID

mysql - SQL 按日期获取最新数据,而不是按 int 值排序

android - Room - 何时初始化数据库以及如何通过应用程序生命周期访问它

objective-c - objective-c 中是否有等效的 sqlite .dump?

MySQL 多删除。是否可以多次删除引用的行?

用于 "IN"语句的变量/字符串的 PHP PDO bindParam ...?

php - 作为输出的数据计数

MySQL删除连接错误

c# - 如何从Sqlite请求中获取一个字段值?

mysql n :m relationship delete query 1242 Subquery returns more than 1 row