查询输出包含多个逗号的行,但我只需要一个逗号和一个分号
SELECT * FROM table WHERE history_coord is NULL OR history_coord LIKE '%,%' AND history_coord LIKE '%;%'
如何更改请求?也许我不用“喜欢”这个词
slsn1g291#
也许这会帮助你:
SELECT * FROM table WHERE history_coord IS NULL OR history_coord REGEXP '^[^,]*,[^,]*;[^;]*$'
在此查询中,REGEXP模式用于匹配一个逗号和一个分号。
^
[^,]
,
;
[^;]
$
a11xaf1n2#
直截了当,就像你说的-使用regexp_matches用正则表达式捕获逗号和分号,然后计数它们。
regexp_matches
SELECT * FROM the_table WHERE history_coord IS NULL OR (select count(*) from regexp_matches(history_coord , ',', 'g')) = 1 and (select count(*) from regexp_matches(history_coord , ';', 'g')) = 1;
附注
如果您的PostgreSQL版本是15+,那么使用函数regexp_count,它大致等同于上面的标量子查询。
regexp_count
mrfwxfqh3#
这是一种使用string_to_array将字符串转换为数组的方法,并使用array_length计算数组的长度,然后减去1来计算字符串中子字符串的出现次数:简单数据:
string_to_array
array_length
CREATE TABLE mytable ( history_coord varchar(50) ); insert into mytable values ('one semicolon ;'), ('one comma ,'), ('one semicolon ; and one comma ,'), ('two semicolon ;; and one comma ,'), ('TEXT');
获取只有一个逗号和一个分号的记录的查询:
SELECT * FROM mytable WHERE array_length(string_to_array(history_coord, ','), 1) - 1 = 1 and array_length(string_to_array(history_coord, ';'), 1) - 1 = 1
结果:
history_coord one semicolon ; and one comma ,
Demo here
3条答案
按热度按时间slsn1g291#
也许这会帮助你:
在此查询中,REGEXP模式用于匹配一个逗号和一个分号。
^
是字符串的开头[^,]
匹配任意数量的非逗号字符。,
与逗号匹配。;
与分号匹配。[^;]
是匹配任何数字,如果字符不是分号。$
是字符串的结尾。a11xaf1n2#
直截了当,就像你说的-使用
regexp_matches
用正则表达式捕获逗号和分号,然后计数它们。附注
如果您的PostgreSQL版本是15+,那么使用函数
regexp_count
,它大致等同于上面的标量子查询。mrfwxfqh3#
这是一种使用
string_to_array
将字符串转换为数组的方法,并使用array_length
计算数组的长度,然后减去1来计算字符串中子字符串的出现次数:简单数据:
获取只有一个逗号和一个分号的记录的查询:
结果:
Demo here