本文介绍SQLite3数据库的文本操作,以及如何使用regexp运算符判断文本内容是否匹配正则表达式的模式。
首先回顾一些文本的基本操作和函数。
||运算符会以文本形式连接两侧的数据,并返回连接后的文本内容,如果有一个运算数为null则连接结果为null。下面的代码演示了||运算符的应用。
select 'abc'||null, 'abc' || 123;
执行代码会返回null和'abc123'。
文本内容是否的相同判断,使用=或==运算符,默认会区分字母大小写,如下面的代码。
select 'abc'='abc', 'abc'='ABC';
执行代码会返回1(true)和0(false)。
比较时需要忽略字母大小写时,可以在相等运算符前添加collate nocase关键字,如下面的代码。
select 'abc' collate nocase = 'ABC';
执行代码会返回1(true)。
like运算符可对文本内容进行模糊匹配,其中,百分号(%)可以表示0或多个字符,下画线(_)表示1个字符。下面的代码演示了like运算符的应用。
select 'abc' like 'A%';
执行代码会返回1(true)。查询判断'abc'是否以'A'开始,可以看到,like运算符忽略了字母大小写,如果需要严格判断字母大小写,应使用glob运算符,如下面的代码会返回0(false)。
select 'abc' glob 'A%';
此外,like运算符还有对应的like(pattern,string)函数可以使用,而glob运算符同样有对应的glob(pattern,string)函数可以使用;参数中,pattern指定匹配模式,string指定判断的文本内容。下面的代码演示了这两个函数的应用。
select like('A%','abc'), glob('A%','abc');
执行代码会返回1和0。
length(data)函数可以返回文本中的字符数量或BLOB的字节数。参数为null值时返回null。如length('abc测试')返回5。
lower(text)函数可以将参数text中的字母转换为小写形式,如lower('ABC123')返回'abc123'。参数为null值时返回null。
upper(text)函数可以将参数text中的字母转换为大写形式,如upper('abc123')返回'ABC123'。参数为null值时返回null。
trim()函数包括两个版本,即trim(text)和trim(tet,extra)。函数的功能是删除文本开始位置和结束位置的空格符和指定的内容。默认删除空格符,删除其它字符需要使用参数extra指定。两个相关的函数为ltrim()和rtrim(),其参数设置与trim()函数相同,ltrim()函数用于删除文本开始位置的空格符和指定字符,rtrim()函数用于删除文本结束位置的空格符和指定字符。下面的代码演示了trim()函数的应用。
select trim(' abc '), trim('abc ','a');
执行代码会返回'abc'和'bc'。其中,第一次调用trim()只删除文本开始和结束位置的空格,第二次调用除了空格,还会删除开始位置和结束位置的字母a。此外,如果参数中包含null,则函数返回结果为null。
quote(value)函数,当value为null时返回null,value为数值时原样返回,value是文本内容时会添加单引号,文本中的一个单引号会转换为两个单引号;函数对数据进行转换的主要是防止SQL注入,转换后的内容可以用于SQL语句的拼接。下面的代码演示了quote()函数的应用。
select quote("abc'123");
执行代码会返回'abc''123'。
replace(value,search,replacement)函数的功能是在value中将search替换为replacement的内容。如果一个参数为null则返回null。下面的代码演示了相关应用。
select replace('abc123abc', 'abc', '***');
执行代码会返回***123***。
substr(string,index,count)函数的功能是从string中的第index个字符截取count个字符,如果不指定count则从index位置开始截取所有字符。参数中有一个是null时函数返回null。下面的代码演示了相关应用。
select substr('abcdefg',3,2), substr('abcdefg',3);
执行代码会返回cd和cdefg。
SQLite3数据库中,可以使用regexp运算符判断文本内容是否匹配正则表达式的模式,应用格式为“<文本> regexp <模式>”,其中,<文本>和<模式>都是单引号定义的文本。对应的函数是regexp(pattern,string),其中,参数pattern指定模式,参数string指定判断的文本内容。下面结合模式的定义来了解regexp运算符的应用,包括匹配内容、匹配次数和匹配位置等。
在模式中定义匹配的内容时,主要包括以下方法:
此外,模式中可以使用一对圆括号定义模式组。一个位置可以匹配多个模式时可以使用|符号分隔。如(a|b)表示此位置可以是a也可以是b。
下面的代码判断文本是否以字母a开始。
select 'abc' regexp 'a.';
下面的代码会使用regexp()函数来判断文本是否包含'a.'。
select regexp('a\.','a.bc');
下面的代码会判断文本是否包含或不包含a、b、c中的一个字符。
select 'aaa' regexp '[abc]', 'xyz' regexp '[^abc]';
执行代码会返回两个1(true)。第一个文本为aaa,包含a字符,匹配结果为1;第二个模式中使用^符号,表示不包含abc,文本xyz中不包含a、b、c中的字符,匹配结果也是1。
下面的代码会判断文本内容是否包含数字。
select 'aaa' regexp '\d', '123' regexp '\d';
执行代码会返回0(false)和1(true)
下面的代码会判断文本中是否包含空白字符。
select 'a c' regexp '\s', '123' regexp '\s';
下面代码演示了\w模式的应用。
select 'abc' regexp '\w', '+-/' regexp '\w';
指定匹配次数的方法包括:
下面的代码演示了+符号的简单应用。
select 'abc' regexp '[abc]+', 'xyz' regexp '[abc]+';
执行代码会返回1(true)和0(false)。本例中的模式会判断文本中应至少包含一个a、b、c中的字符。
下面的代码会判断文本中是否包含两个连续的a。
select 'abc' regexp 'a{2}', 'aab' regexp 'a{2}';
执行代码会返回0(false)和1(true)。
常用的位置匹配方法如下:
下面的代码会判断文本内容是不是以1开始的11位手机号码。
select '12345678910' regexp '^1\d{10}$';
本例,模式定义以1开始(^1),并以10个数字结束(\d{10}$)。执行代码会返回1(true),可以修改文本内容来观察执行结果。
下面的代码判断文本是否包含独立的单词jim。
select 'jim' regexp '\bjim\b', 'jimmy' regexp '\bjim\b';
执行代码会显示1(true)和0(false)。