Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用GLOB匹配SQLite文本字段中的每个字符_Sqlite_Glob - Fatal编程技术网

使用GLOB匹配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

我在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}')
    -这不起作用,我想这是因为
    GLOB
    不支持花括号符号-如果我错了,请纠正我
  • 检查(长度(myfield)==17和myfield GLOB'[A-HJ-NPR-Z0-9]')
    也不起作用,可能是因为第二个检查条件只匹配一个字符,与第一个字符相矛盾
  • 我确信有一个比为字符串中的每个字符设置17个检查条件更简单的解决方案
    只需复制粘贴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]')
    )