使用GLOB匹配SQLite文本字段中的每个字符
我在SQLite表中有一个使用GLOB匹配SQLite文本字段中的每个字符,sqlite,glob,Sqlite,Glob,我在SQLite表中有一个TEXT字段,要求长度正好为17个字符。让我们称之为myfield 对于此表中的任意行,如何在检查括号内使用SQLite的GLOB运算符来匹配myfield列条目中的每个字符(如果可能,还可以强制执行17个字符的约束) 此条目中的每个字符都可以是任何数字0-9,或除I、O和Q之外的任何大写字母。另外,myfield条目的第9个字符只能是数字0-9或字母X,但我仍在尝试先获取前面的条件 我试过什么? CHECK(myfieldglob'[A-HJ-NPR-Z0-9]{17
TEXT
字段,要求长度正好为17个字符。让我们称之为myfield
对于此表中的任意行,如何在检查
括号内使用SQLite的GLOB
运算符来匹配myfield
列条目中的每个字符(如果可能,还可以强制执行17个字符的约束)
此条目中的每个字符都可以是任何数字0-9
,或除I
、O
和Q
之外的任何大写字母。另外,myfield
条目的第9个字符只能是数字0-9
或字母X
,但我仍在尝试先获取前面的条件
我试过什么?
CHECK(myfieldglob'[A-HJ-NPR-Z0-9]{17}')
-这不起作用,我想这是因为GLOB
不支持花括号符号-如果我错了,请纠正我检查(长度(myfield)==17和myfield GLOB'[A-HJ-NPR-Z0-9]')
也不起作用,可能是因为第二个检查条件只匹配一个字符,与第一个字符相矛盾只需复制粘贴17次即可 [A-HJ-NPR-NPR-NPR-Z0-9][A-A-HJ-NPR-NPR-Z0-9][A-A-HJ-NPR-NPR-Z0-Z0-9-9][A-A-HJ-NPR-Z0-9-9][A-A-HJ-HJ-NPR-NPR-Z0-9][A-A-A-HJ-HJ-NPR-NPR-NPR-NPR-Z0-Z0-Z0-Z0---Z0-----Z0--------Z0-9-10-9-9-9 9 9 9 9 9 9 9 9 9 9 9 9 9 9][A-8-8-8-8-8-8-8-8-8------------NPR-NPR-NPR-NPR-NPR-NPR-NPR-NPR-NPR-NPR-NPR-NPR-NPR-9-9[A-HJ-NPR-Z0-9][A-HJ-NPR-Z0-9]”) 在第9个元素中,只需输入X0-9,就可以检查“myfield条目的第9个字符只能是数字0-9或字母X” 通过这样做,您还可以在SQLite中强制执行17个字符的约束。有一种方法可以模拟类似MySql的函数,该函数返回重复n次的字符串。
因此: 将字符串
'[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]
您可以使用此技巧(通过串联)构造CHECK
约束中GLOB
之后所需的字符串:
CHECK(myfield GLOB
REPLACE(HEX(ZEROBLOB(8)), '00', '[A-HJ-NPR-Z0-9]') ||
'[X0-9]' ||
REPLACE(HEX(ZEROBLOB(8)), '00', '[A-HJ-NPR-Z0-9]')
)
请参阅简化的。
如果可以添加
REGEXP
用户定义函数(),则可以使用:CHECK(myfield REGEXP'^[a-HJ-NPR-Z0-9]{17}$)
@TimBiegeleisen那太好了-我对REGEXP
有一个有效的解决方案-但是我试图解决的问题的局限性要求我坚持使用GLOB
。你可以看看字符串函数trim(),看看你是否可以用它做些什么。
CHECK(myfield GLOB
REPLACE(HEX(ZEROBLOB(8)), '00', '[A-HJ-NPR-Z0-9]') ||
'[X0-9]' ||
REPLACE(HEX(ZEROBLOB(8)), '00', '[A-HJ-NPR-Z0-9]')
)