SQL:匹配一个字符串模式,不管大小写,列中的空格

SQL: match a string pattern irrespective of it's case, whitespaces in a column

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

例如,如果我的字符串是 My Tec Bits 并且它们出现在我的 table 中,如下所示:

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,因为去掉白色 pace 并且不管大小写,所有这些字符串都是相同的。

SQL 中是否有任何 grep()R 中的等价物?

你可以使用

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

仅检查大写并删除白色 space。

您可以在比较它们之前将您的语句转换为 LOWER(),例如。

LOWER(column_name) = LOWER(variable)

更具体:

LOWER(First_name) = LOWER('JoHn DoE')

将成为名字 = 'john doe'

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

REPLACE(yourstring, ' ' , '')

' ' = 一个 space 字符用空字符串替换它 = ''

所以你会这样做

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

您需要使用count来取回受影响的数字,Lower会将数据转为小写,这样当您进行一个比较,你可以把它变成小写。

要删除 space,然后使用 Replace 并将 space 替换为空字符串以进行比较:

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

如果您只关心 SPACECASE,那么您需要两个函数:

  • 替换
  • UPPER/LOWER

例如,

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>

Then, the output should be 6

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

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 子句仅用于为 构建 示例 table演示 目的。在我们的实际查询中,删除整个 WITH 部分,并在 FROM 子句 中使用您的 实际 table_name

所以,您只需要做:

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

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

  • 忽略空格

  • 忽略大小写

  • 计算字符串出现的次数

所以您需要如下查询 -

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

这会计算 table 中的行数,其中 fielduserstring 相同,忽略大小写(使用 [=13 设置为相同的大小写) =],所以它被有效地忽略了),并且空格被忽略了(使用 REPLACEfielduserstring 中删除了空格)

由于 REGEXP 不区分大小写,您可以通过将 spaces 设为可选来获得匹配,例如:

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

注:如有需要,可在"MY"前加space或[[:<:]](字界)和space 或 "BITS" 之后的 [[:>:]] 以避免误报。