【问题标题】:SQLite, check if TEXT field has any alphabetical chars in itSQLite,检查 TEXT 字段中是否有任何字母字符
【发布时间】:2014-02-03 03:24:49
【问题描述】:

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

【问题讨论】:

  • 你试过select abs(num) where num like '%A%'看看返回了什么?
  • @RaphaëlAlthaus 感谢您的建议,我在尝试您的建议后编辑了帖子。检查我的帖子的结尾。

标签: sql sqlite sql-delete


【解决方案1】:

您可以在 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]*'

【讨论】:

  • WHERE num GLOB '*[A-z]*' 使它更短。
猜你喜欢
  • 2017-10-18
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 2011-04-03
相关资源
最近更新 更多