postgresql SQL如何输出一行只有一个“,”和一个字符“;“

vi4fp9gy  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(3)|浏览(161)

查询输出包含多个逗号的行,但我只需要一个逗号和一个分号

SELECT *
FROM table
WHERE history_coord is NULL
   OR history_coord LIKE '%,%' AND history_coord LIKE '%;%'

如何更改请求?也许我不用“喜欢”这个词

slsn1g29

slsn1g291#

也许这会帮助你:

SELECT *
FROM table
WHERE history_coord IS NULL
   OR history_coord REGEXP '^[^,]*,[^,]*;[^;]*$'

在此查询中,REGEXP模式用于匹配一个逗号和一个分号。

  • ^是字符串的开头
  • [^,]匹配任意数量的非逗号字符。
  • ,与逗号匹配。
  • ;与分号匹配。
  • [^;]是匹配任何数字,如果字符不是分号。
  • $是字符串的结尾。
a11xaf1n

a11xaf1n2#

直截了当,就像你说的-使用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,它大致等同于上面的标量子查询。

mrfwxfqh

mrfwxfqh3#

这是一种使用string_to_array将字符串转换为数组的方法,并使用array_length计算数组的长度,然后减去1来计算字符串中子字符串的出现次数:
简单数据:

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

相关问题