微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用GLOB匹配SQLite TEXT字段中的每个字符

如何解决使用GLOB匹配SQLite TEXT字段中的每个字符

我在sqlite表中有一个TEXT字段,该字段必须正好是17个字符。我们称之为myfield

对于此表中的任意行,我们如何在GLOB括号内使用sqlite的CHECK运算符来匹配myfield列条目中的每个字符(并且,如果可能,强制执行17个字符的约束)?

此条目中的每个字符可以是任何数字0 - 9,也可以是除IOQ以外的任何大写字母。另外,myfield项的第9个字符只能是数字0 - 9或字母X,但我仍在尝试首先获得上述条件。

我尝试了什么?

  1. CHECK(myfield GLOB '[A-HJ-NPR-Z0-9]{17}')-这不起作用,我认为是因为GLOB不支持大括号表示法-如果我输入错误,请更正我。
  2. CHECK(length(myfield) == 17 AND myfield GLOB '[A-HJ-NPR-Z0-9]')-也不起作用,大概是因为第二个检查条件只匹配一个字符,与第一个字符相反。
  3. 我相信有比为字符串中的每个字符设置17个检查条件更简单的解决方案!

解决方法

只需复制并粘贴17次

检查(myfield GLOB“ [A-HJ-NPR-Z0-9] [A-HJ-NPR-Z0-9] [A-HJ-NPR-Z0-9] [A-HJ-NPR-Z0- 9] [A-HJ-NPR-Z0-9] [A-HJ-NPR-Z0-9] [A-HJ-NPR-Z0-9] [A-HJ-NPR-Z0-9] [X0-9 ] [A-HJ-NPR-Z0-9] [A-HJ-NPR-Z0-9] [A-HJ-NPR-Z0-9] [A-HJ-NPR-Z0-9] [A-HJ- NPR-Z0-9] [A-HJ-NPR-Z0-9] [A-HJ-NPR-Z0-9] [A-HJ-NPR-Z0-9]“)

在第9个元素上,只需键入X0-9,因此也可以检查“ myfield条目的第9个字符只能是数字0-9或字母X” 这样,您还可以强制执行17个字符的约束

,

在SQLite中,有一个trick来模仿MySql的REPEAT()之类的函数,该函数返回重复 n 次的字符串。
因此:

REPLACE(HEX(ZEROBLOB(8)),'00','[A-HJ-NPR-Z0-9]')

您得到的字符串'[A-HJ-NPR-Z0-9]'重复了8次:

[A-HJ-NPR-Z0-9][A-HJ-NPR-Z0-9][A-HJ-NPR-Z0-9][A-HJ-NPR-Z0-9][A-HJ-NPR-Z0-9][A-HJ-NPR-Z0-9][A-HJ-NPR-Z0-9][A-HJ-NPR-Z0-9]

您可以使用此技巧来(通过串联)构造GLOB约束中CHECK之后所需的字符串:

CHECK(myfield GLOB 
                REPLACE(HEX(ZEROBLOB(8)),'[A-HJ-NPR-Z0-9]') || 
                '[X0-9]' || 
                REPLACE(HEX(ZEROBLOB(8)),'[A-HJ-NPR-Z0-9]')
)

查看简化的demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。