我有一个包含两个字段的表。第一个是类型name
的{{1}}。第二个包含一个或多个用逗号分隔的字符串(但可以包含一个完全没有逗号的字符串)
我想构建一个查询,以了解{{1}中的每个逗号分隔的字符串中是否不存在string
字段中的字符串}字段。
示例1:
name
所有用逗号分隔的字符串都包含单词names
。因此查询应不返回此行。
但是,示例2:
---------------------------------------------------------
name names
---------------------------------------------------------
myname xmyname,myname,mynamey
应退回。因为x不包含我的名字。
条件是,如果myname
字段中逗号分隔的字符串的每个中都不存在字段---------------------------------------------------------
name names
---------------------------------------------------------
myname x,myname,mynamey
中的字符串,则返回该行。
这是不正确的,因为此查询在示例2(包含name
而不包含names
的示例中不会返回true)。
重要说明:
1)那里没有多少个逗号没有限制。可以是0个逗号或更多。怎么处理呢?
2)字符串是变量。字符串并非总是x
的情况。每行在myname
字段中包含一个不同的字符串。
答案 0 :(得分:0)
此答案开始时给出了错误的REGEXP
解决方案。但是,这里最好的做法是修复数据模型,以使names
列中的每个名称实际上位于单独的行中:
name | names
myname | xmyname
myname | myname
myname | mynamey
somename | x
somename | myname
somename | mynamey
现在我们可以做一个简单的汇总查询来回答您的问题:
SELECT name
FROM yourTable
GROUP BY name
HAVING COUNT(CASE WHEN names NOT LIKE CONCAT('%', name, '%') THEN 1 END) > 0;
答案 1 :(得分:0)
假设“ myname”在两个逗号之间没有出现“ 两次”,则可以计算逗号和“ myname”:
where (length(names) - length(replace(names, ','))) >=
length(names) - length(replace(names, 'myname', '12345'))
答案 2 :(得分:0)
您可以使用以下SQL
查询
SELECT
name, names
FROM
`tablename`
WHERE
(LENGTH(names) - LENGTH(REPLACE(names, ',', '')) + 1)
=
ROUND (
(
LENGTH(names)
- LENGTH( REPLACE ( names, name, "") )
)/ LENGTH(name)
);
说明:-
这将为您提供用,
分隔多少个单词
(LENGTH(names) - LENGTH(REPLACE(names, ',', '')) + 1) -
以下内容与每行中的name
匹配,并返回找到的次数
ROUND (
(
LENGTH(names)
- LENGTH( REPLACE ( names, name, "") )
) / LENGTH(name)
)
答案 3 :(得分:0)
尝试以下正则表达式:
where not concat(names, ',') regexp replace('^([^,]*{n}[^,]*,)*$', '{n}', name)
如何阅读模式:
内部模式[^,]*{n}[^,]*,
的含义
[^,]
重复了任意次(*
表示没有次数或多次)。name
的值({n}
是一个占位符,将使用replace()
函数用实际值替换)[^,]
外部模式^({inner_pattern})*$
表示
^
)的开头$
)为实现此目的,在names
列(concat(names, ',')
)后面附加了一个逗号,以便字符串中的每个元素都以逗号结尾。
该模式将确保逗号分隔的字符串中的任何元素都包含name
列的值。由于您想要相反的结果,因此我们使用where not ..
。