Mysql SQL:匹配字符串模式而不考虑它';s的情况下,列中的空格

Mysql SQL:匹配字符串模式而不考虑它';s的情况下,列中的空格,mysql,sql,regex,agrep,Mysql,Sql,Regex,Agrep,我需要找到列中字符串的频率,而不管其大小写和任何空格 例如,如果我的字符串是my Tec Bits,它们出现在我的表中,如下所示: 061 MYTECBITS 12123 102 mytecbits 24324 103 MY TEC BITS 23432 247 my tec bits 23243 355 My Tec Bits 23424 454 My Tec BitS 23432 然后,输出应该是6,因为在删除了空格且不考虑大小写的情况下,所有这些字符串都是

我需要找到列中字符串的频率,而不管其大小写和任何空格

例如,如果我的字符串是
my Tec Bits
,它们出现在我的表中,如下所示:

061  MYTECBITS    12123
102  mytecbits    24324
103  MY TEC BITS  23432
247  my tec bits  23243
355  My Tec Bits  23424
454  My Tec BitS  23432
然后,输出应该是
6
,因为在删除了空格且不考虑大小写的情况下,所有这些字符串都是相同的


SQL
中是否有与
R
中相同的
grep()

UPPER(REPLACE(userString, ' ', ''))

只检查大写字母并删除空白。

在比较语句之前,您可以将语句转换为小写()

LOWER(column_name) = LOWER(variable)
更具体地说:

LOWER(First_name) = LOWER('JoHn DoE')
将成为名='john doe'

对于应使用“替换”的间距,其格式为:

REPLACE(yourstring, ' ' , '')
“”=一个空格字符,将其替换为一个空字符串=“”

你会这么做吗

WHERE LOWER(REPLACE(fieldname, ' ', '') = 'mytecbits'

您需要使用count返回受影响的数字,Lower将数据放在小写位置,以便在进行比较时可以将其放在小写位置

要删除空格,请使用Replace并将空格替换为空字符串进行比较:

Select COUNT(ColumnA) 
from table 
where Lower(Replace(ColumnB, ' ', '')) = 'mytecbits'

如果您只关心空格案例,则需要两个功能:

  • 更换
  • 上/下
比如说,

SQL> WITH DATA AS(
  2  SELECT 'MYTECBITS' STR FROM DUAL UNION ALL
  3  SELECT 'mytecbits' STR FROM DUAL UNION ALL
  4  SELECT 'MY TEC BITS' STR FROM DUAL UNION ALL
  5  SELECT 'my tec bits' STR FROM DUAL UNION ALL
  6  SELECT 'MY TEC BITS' STR FROM DUAL UNION ALL
  7  SELECT 'MY TEC BITS' STR FROM DUAL
  8  )
  9  SELECT UPPER(REPLACE(STR, ' ', '')) FROM DATA
 10  /

UPPER(REPLA
-----------
MYTECBITS
MYTECBITS
MYTECBITS
MYTECBITS
MYTECBITS
MYTECBITS

6 rows selected.

SQL>
然后,输出应该是6

因此,基于此,您需要在过滤器谓词计数(*)返回的行中使用它:

SQL> WITH DATA AS(
  2  SELECT 'MYTECBITS' STR FROM DUAL UNION ALL
  3  SELECT 'mytecbits' STR FROM DUAL UNION ALL
  4  SELECT 'MY TEC BITS' STR FROM DUAL UNION ALL
  5  SELECT 'my tec bits' STR FROM DUAL UNION ALL
  6  SELECT 'MY TEC BITS' STR FROM DUAL UNION ALL
  7  SELECT 'MY TEC BITS' STR FROM DUAL
  8  )
  9  SELECT COUNT(*) FROM DATA
 10  WHERE UPPER(REPLACE(STR, ' ', '')) = 'MYTECBITS'
 11  /

  COUNT(*)
----------
         6

SQL>
注意
子句仅用于构建样本表,用于演示目的。在我们的实际查询中,删除整个WITH part,并在FROM子句中使用实际表名

所以,你只需要做:

SELECT COUNT(*) FROM YOUR_TABLE 
  WHERE UPPER(REPLACE(STR, ' ', '')) = 'MYTECBITS'
/

如果要查找一个特定字符串的实例数,而不考虑大小写/空格,则需要执行以下操作-

SELECT 
    COUNT(field)
FROM
    table
WHERE
    UPPERCASE(REPLACE(field, ' ', '')) = UPPERCASE(REPLACE(userstring, ' ', ''))
  • 忽略空白

  • 忽略案例

  • 计算字符串的实例数

因此,您需要一个如下所示的查询-

SELECT 
    COUNT(field)
FROM
    table
WHERE
    UPPERCASE(REPLACE(field, ' ', '')) = UPPERCASE(REPLACE(userstring, ' ', ''))

当忽略大小写时(所有大小写都使用
大写设置为同一大小写,因此有效地忽略了大小写),这将统计表中
字段
用户字符串
相同的行数,并忽略空格(使用
REPLACE
字段和
userstring
中删除空格)

由于REGEXP不区分大小写,因此可以通过将空格设置为可选来获得匹配,例如:

SELECT count(field) FROM yourtable WHERE field REGEXP "MY *TEC *BITS";

注意:如果需要,可以在“位”之后添加空格或
[[[::]]
避免误报。

您使用的是MySQL还是Oracle?除非同时使用两个数据库,否则不应同时添加这两个标记。请注意,在MySQL中,默认情况下,REGEXP是不区分大小写的。@CasimiretHippolyte-区分大小写取决于被测列的排序规则。@RickJames:我只能是二进制排序规则的问题,b但是,在这种情况下,您可以人为地使用
COLLATE
关键字更改它以进行字符串搜索。但是正如我所说的,默认情况下
选择“a”REGEXP“a”;
返回1个很好的示例。但是…
SET@@collation\u connection=utf8\u bin;选择“a”REGEXP“a”;
返回0。因此,我声称是排序规则regexp决定是否进行大小写折叠。这也将匹配
我的其他技术位
。他只想忽略空格,不允许其他文本。感谢我没有意识到他只想忽略单个空格。根据ha-ha更新..这不是打字错误..顺便说一句,使用
'我的%tech%bits'
打开了一个新的维度,我希望能学到一些新的东西。我认为将
与数据一起使用作为
会使你的答案过于复杂。@Eilidh所以当OP没有提供任何示例数据时该怎么办。
WITH
子句在这里只是构建表来演示。不要混淆。我们使用WITH子句来演示s当样本数据不可用时。这是你投否决票的原因吗?我不感到困惑,我知道你为什么使用
WITH
子句,但OP表示它们对SQL非常陌生,在你的答案中显示这一点对OP的问题是不必要的,并且混淆了重要部分。@Eilidh重要部分被称为bullet点在顶部。无论如何,我在结尾添加了一个关于WITH子句的注释,如果这让你感到舒服的话。为没有提及表名和造成混乱表示歉意。请以非常清晰的方式说出来。另外@christian barron的答案与我想找的完全一样。是的,它很有帮助。如果
排序规则是“…_ci”,
LOWER()
是不必要的,它会阻止索引的使用。老实说,我必须查找排序规则到底是什么,但这意味着您无法正确检查大小写敏感度(我将在这里进行有根据的猜测,并假设ci代表不区分大小写)您以后可能会想这样做,或者您可以为每个查询设置排序规则吗?排序规则通常是列的默认值,然后被忽略。您可以在比较中使用
collation…
子句,但这是非常罕见的。我要向您(以及此线程中的所有其他人)指出是的,
fieldname
的排序可能不需要
LOWER()
。大多数人混淆了“字符集”和“排序规则”。