Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择第一个、最后一个或两个字符都是特殊字符或标点符号的行,除非它们的末尾只有句点_Sql_Oracle_Regexp Like - Fatal编程技术网

Sql 选择第一个、最后一个或两个字符都是特殊字符或标点符号的行,除非它们的末尾只有句点

Sql 选择第一个、最后一个或两个字符都是特殊字符或标点符号的行,除非它们的末尾只有句点,sql,oracle,regexp-like,Sql,Oracle,Regexp Like,我需要从表中检索名称以[:space:]或其他特殊字符[:punt:]开头或结尾的行,不包括单个点。在名字的末尾。这个想法是提取可能不一致的名称 必须出现的示例: “乔治父子”——结尾有一个额外的空格。 “-GEORGE&SON”-一开始有一个额外的-。 “&GEORGE&SON”-一开始有一个额外的&。 “GEORGE&SON S.A.”一开始有一个额外的。圆点。最后,这不是问题。 “乔治和儿子……”结尾不是一个,而是两个点。对于以多个字符串结尾的字符串,这是一个例外。;他们也是坏名声。 不得

我需要从表中检索名称以[:space:]或其他特殊字符[:punt:]开头或结尾的行,不包括单个点。在名字的末尾。这个想法是提取可能不一致的名称

必须出现的示例:

“乔治父子”——结尾有一个额外的空格。 “-GEORGE&SON”-一开始有一个额外的-。 “&GEORGE&SON”-一开始有一个额外的&。 “GEORGE&SON S.A.”一开始有一个额外的。圆点。最后,这不是问题。 “乔治和儿子……”结尾不是一个,而是两个点。对于以多个字符串结尾的字符串,这是一个例外。;他们也是坏名声。 不得出现的示例:

“乔治父子”-最后只有一个“.”。 我使用的表达式是:

REGEXP_LIKE(col, '(^[[:punct:]]|[[:punct:]]$)|(^[[:space:]]|[[:space:]]$)')
但是,尽管检索以空格或特殊字符开头或结尾的名称,也会提取以点“.”作为最后一个字符的名称

如何更改此项以获得所需的结果?

只需在第二个[[:punct:]之后添加{2}。这意味着圆点应该至少出现两次

with tab as(
  select 'GEORGE & SON ' as s from dual union all
  select '-GEORGE & SON'  as s from dual union all
  select '&GEORGE & SON'  as s from dual union all
  select 'GEORGE & SON..'  as s from dual union all
  select 'GEORGE & SON.'  as s from dual union all
  select '-GEORGE & SON S.A.' as s from dual  
)
select * from  tab 
where REGEXP_LIKE(s, '(^[[:punct:]]|[[:punct:]]{2}$)|(^[[:space:]]|[[:space:]]$)') 

由于预定义的标点符号字符类不适用于字符串的结尾,因此将使用自定义字符类。故意漏掉这个点。在这种情况下,单独添加单引号作为转义是不起作用的,并且为q运算符找到正确的字符可能很难做到。由于Oracle在转义时似乎无法正确处理,因此单独添加了结束方括号。最后明确添加尾随的连续点:

WITH T (id, col) AS (
  SELECT 1, 'GEORGE & SON ' FROM DUAL UNION ALL
  SELECT 2, '-GEORGE & SON'  FROM DUAL UNION ALL
  SELECT 3, '&GEORGE & SON'  FROM DUAL UNION ALL
  SELECT 4, 'GEORGE & SON..'  FROM DUAL UNION ALL
  SELECT 5, 'GEORGE & SON.'  FROM DUAL UNION ALL
  SELECT 6, '-GEORGE & SON S.A.' FROM DUAL UNION ALL
  SELECT 7, 'GEORGE & SON!' FROM DUAL UNION ALL
  SELECT 8, 'GEORGE & SON"' FROM DUAL UNION ALL
  SELECT 9, 'GEORGE & SON#' FROM DUAL UNION ALL
  SELECT 10, 'GEORGE & SON$' FROM DUAL UNION ALL
  SELECT 11, 'GEORGE & SON%' FROM DUAL UNION ALL
  SELECT 12, 'GEORGE & SON&' FROM DUAL UNION ALL
  SELECT 13, 'GEORGE & SON(' FROM DUAL UNION ALL
  SELECT 14, 'GEORGE & SON)' FROM DUAL UNION ALL
  SELECT 15, 'GEORGE & SON*' FROM DUAL UNION ALL
  SELECT 16, 'GEORGE & SON+' FROM DUAL UNION ALL
  SELECT 17, 'GEORGE & SON,' FROM DUAL UNION ALL
  SELECT 18, 'GEORGE & SON\' FROM DUAL UNION ALL
  SELECT 19, 'GEORGE & SON-' FROM DUAL UNION ALL
  SELECT 20, 'GEORGE & SON\' FROM DUAL UNION ALL
  SELECT 21, 'GEORGE & SON/' FROM DUAL UNION ALL
  SELECT 22, 'GEORGE & SON:' FROM DUAL UNION ALL
  SELECT 23, 'GEORGE & SON;' FROM DUAL UNION ALL
  SELECT 24, 'GEORGE & SON<' FROM DUAL UNION ALL
  SELECT 25, 'GEORGE & SON=' FROM DUAL UNION ALL
  SELECT 26, 'GEORGE & SON>' FROM DUAL UNION ALL
  SELECT 27, 'GEORGE & SON?' FROM DUAL UNION ALL
  SELECT 28, 'GEORGE & SON@' FROM DUAL UNION ALL
  SELECT 29, 'GEORGE & SON[' FROM DUAL UNION ALL
  SELECT 30, 'GEORGE & SON^' FROM DUAL UNION ALL
  SELECT 31, 'GEORGE & SON_' FROM DUAL UNION ALL
  SELECT 32, 'GEORGE & SON`' FROM DUAL UNION ALL
  SELECT 33, 'GEORGE & SON{' FROM DUAL UNION ALL
  SELECT 34, 'GEORGE & SON|' FROM DUAL UNION ALL
  SELECT 35, 'GEORGE & SON}' FROM DUAL UNION ALL
  SELECT 36, 'GEORGE & SON~' FROM DUAL UNION ALL
  SELECT 37, 'GEORGE & SON''' FROM DUAL UNION ALL
  SELECT 38, 'GEORGE & SON]' FROM DUAL)
SELECT
  * FROM T
 WHERE REGEXP_LIKE(col, '(^[[:punct:]]|[-!"#$%&()*+,\/:;<=>?@[^_`{|}~' || '''' || ']$)|]$|\.\.$|(^[[:space:]]|[[:space:]]$)')
 ORDER BY id
;
如果要在字符串中明确显示,请仅使用单词字符将其包围:

\w[[:space:][:punct:]]{2,}\w
当找到单个空格时,前导/尾随连续空格已匹配-无需明确担心它们。 其中:

WITH T (id, col) AS (
  SELECT 50, 'GEORGE & SON  ' FROM DUAL UNION ALL
  SELECT 51, 'GEORGE & SON   '  FROM DUAL UNION ALL
  SELECT 52, '  GEORGE & SON'  FROM DUAL UNION ALL
  SELECT 53, '    GEORGE & SON'  FROM DUAL UNION ALL
  SELECT 54, 'GEORGE &  SON'  FROM DUAL UNION ALL
  SELECT 55, 'GEORGE  & SON S.A.' FROM DUAL UNION ALL
  SELECT 56, 'GEORGE & SON    S.A.' FROM DUAL UNION ALL
  SELECT 60, '  GEORGE and SON'  FROM DUAL UNION ALL
  SELECT 61, ' ,GEORGE and SON' FROM DUAL UNION ALL
  SELECT 62, ', GEORGE and SON'  FROM DUAL UNION ALL
  SELECT 63, 'GEORGE -- SON' FROM DUAL UNION ALL
  SELECT 64, 'GEORGE --SON' FROM DUAL UNION ALL
  SELECT 65, 'GEORGE & SON' FROM DUAL UNION ALL
  SELECT 66, 'GEORGE + SON' FROM DUAL UNION ALL
  SELECT 67, 'GEORGE and  , SON' FROM DUAL UNION ALL
  SELECT 68, 'GEORGE and , SON' FROM DUAL UNION ALL
  SELECT 69, 'GEORGE and SON ,'  FROM DUAL UNION ALL
  SELECT 70, 'GEORGE and SON. '  FROM DUAL UNION ALL
  SELECT 71, 'GEORGE and+-SON'  FROM DUAL)
SELECT
  * FROM T
--  WHERE REGEXP_LIKE(col, '(^[[:punct:]]|[-!"#$%&()*+,\/:;<=>?@[^_`{|}~' || '''' || ']\.?$)|]$|\.\.$|(^[[:space:]]|[[:space:]]$)|[[:space:][:punct:]]{2,}')
  WHERE REGEXP_LIKE(col, '(^[[:punct:]]|[-!"#$%&()*+,\/:;<=>?@[^_`{|}~' || '''' || ']\.?$)|]$|\.\.$|(^[[:space:]]|[[:space:]]$)|\w[[:space:][:punct:]]{2,}\w')
  ORDER BY id
;
可能接

  WHERE
  REGEXP_LIKE(col, '\w[[:space:][:punct:]]{2,}\w')
  AND
  (REGEXP_LIKE(col, ' [[:upper:]]\. \w')
   OR
   INSTR(col, ', ') > 0
   OR
   INSTR(col, ' & ') > 0
  )
为了在多个有效数字之间找到乔治和儿子。INSTR可能比REGEX更快-取决于整体情况

再多说几句关于力学的话 i[[:punct:[:space:]基本上将[[:punct:]和[[:space:]组合成一个字符类。就从那一类中选择而言,顺序是无关紧要的

二,

添加了一个单引号。如果这是直接尝试的,Oracle会考虑单引号来结束参数值。用反斜杠转义单引号是行不通的…所以基本上,这就是上面所说的分别添加单引号


如果需要调整/进一步详细信息,请发表意见。

这将忽略结尾处的任何标点符号-因此它将与“GEORGE&SON&”等不匹配。“我想只有一个句号需要特殊处理,结尾没有标点符号吗?”亚历克斯普尔从例子中脱口而出。但是你是对的,这个案子是不可匹敌的。你是对的,亚历克斯·普尔。需要获取所有具有无效客户端名称的行;[以]>[:punt:{1或更多}或[:space:{1或更多}结尾,不包括由“点”折叠的[:alpha:]。[以]>[:点:{1或更多}或[:空格:{1或更多}开头。[完整字段]>[:点:{2或更多}或[:空格:{2或更多}。嗨,阿贝西。我真诚地向你和像你这样的人致以最美好的祝愿,他们是我们的大帮手。我测试了一下,发现regex没有抓到GEORGE**:punct:*儿子。在单词之间获取一个puntuation字符,其中只允许“-”。我知道我没有要求,但在你宝贵的帮助下,我已经能够建立一套解决我问题的角色。所以,乔治森应该被抓住,乔治-森不应该被抓住。我很感激你的善良和耐心。非常感谢。这是我的第一个问题,我必须如何关闭它?好主意。多谢各位。这个问题太复杂了。我已经注意到,fech'GEORGE&SON.。空格和\.的组合仍然不包括在完整的{2或更多}字符串中重复的可能性,例如[:Space:],[:putch:]或两者之间的组合,检索:'GEORGE SON'-'[:Space:{2或更多}GEORGE SON'-[:putch:{2或更多}GEORGE SON'*.[:Space:][:punct:{2或更多}'GEORGE SON'-''或''或'*'[:空格:]和[:punct:{2或更多}@LEOPOLDO您提到的部分/大部分内容可以很容易地用量词来满足。只需扩展您问题中的示例列表,可能还有SQL FIDLE。可能无法用一个WHERE子句轻松地抓住所有案例,但仍然可以让您有更多的候选人进行审查。您能插入其中一个,作为示例,让我理解吗亲爱的felow,请借给我Abecee。我会在早上第一件事测试并让你知道。我向你致以最良好的问候,感谢你的时间和知识。嗨,Abecee。我非常感谢你的支持。我可以再问两个问题吗?你说的是“两个或更多空格/标点符号的序列” 字符被“[[:space:][:punct:][]{2,}”捕获。我的问题是:1**这是双向的吗?空格/标点和标点/空格!!!-**2为了让我理解,你能解释一下字符集“[-!$%&*+,\/:;?@[^ `{124;}~'.\ 124; | | |]\.?$的含义吗。我是正则表达式的新手,不知道(比如)集合“| | | |”的含义。再次感谢你。
[[:space:][:punct:]]{2,}
\w[[:space:][:punct:]]{2,}\w
WITH T (id, col) AS (
  SELECT 50, 'GEORGE & SON  ' FROM DUAL UNION ALL
  SELECT 51, 'GEORGE & SON   '  FROM DUAL UNION ALL
  SELECT 52, '  GEORGE & SON'  FROM DUAL UNION ALL
  SELECT 53, '    GEORGE & SON'  FROM DUAL UNION ALL
  SELECT 54, 'GEORGE &  SON'  FROM DUAL UNION ALL
  SELECT 55, 'GEORGE  & SON S.A.' FROM DUAL UNION ALL
  SELECT 56, 'GEORGE & SON    S.A.' FROM DUAL UNION ALL
  SELECT 60, '  GEORGE and SON'  FROM DUAL UNION ALL
  SELECT 61, ' ,GEORGE and SON' FROM DUAL UNION ALL
  SELECT 62, ', GEORGE and SON'  FROM DUAL UNION ALL
  SELECT 63, 'GEORGE -- SON' FROM DUAL UNION ALL
  SELECT 64, 'GEORGE --SON' FROM DUAL UNION ALL
  SELECT 65, 'GEORGE & SON' FROM DUAL UNION ALL
  SELECT 66, 'GEORGE + SON' FROM DUAL UNION ALL
  SELECT 67, 'GEORGE and  , SON' FROM DUAL UNION ALL
  SELECT 68, 'GEORGE and , SON' FROM DUAL UNION ALL
  SELECT 69, 'GEORGE and SON ,'  FROM DUAL UNION ALL
  SELECT 70, 'GEORGE and SON. '  FROM DUAL UNION ALL
  SELECT 71, 'GEORGE and+-SON'  FROM DUAL)
SELECT
  * FROM T
--  WHERE REGEXP_LIKE(col, '(^[[:punct:]]|[-!"#$%&()*+,\/:;<=>?@[^_`{|}~' || '''' || ']\.?$)|]$|\.\.$|(^[[:space:]]|[[:space:]]$)|[[:space:][:punct:]]{2,}')
  WHERE REGEXP_LIKE(col, '(^[[:punct:]]|[-!"#$%&()*+,\/:;<=>?@[^_`{|}~' || '''' || ']\.?$)|]$|\.\.$|(^[[:space:]]|[[:space:]]$)|\w[[:space:][:punct:]]{2,}\w')
  ORDER BY id
;
WHERE
  REGEXP_LIKE(col, '\w[[:space:][:punct:]]{2,}\w')
  AND
  NOT REGEXP_LIKE(col, ' [[:upper:]]\. \w')
  AND
  NOT INSTR(col, ', ') > 0
  AND
  NOT INSTR(col, ' & ') > 0
  WHERE
  REGEXP_LIKE(col, '\w[[:space:][:punct:]]{2,}\w')
  AND
  (REGEXP_LIKE(col, ' [[:upper:]]\. \w')
   OR
   INSTR(col, ', ') > 0
   OR
   INSTR(col, ' & ') > 0
  )
[-!"#$%&()*+,\/:;<=>?@[^_`{|}~' || '''' || ']
[-!"#$%&()*+,\/:;<=>?@[^_`{|}~]