Регулярное выражение не соответствует правильной строке - PullRequest
0 голосов
/ 16 мая 2018

Я занят созданием справочной таблицы для конкретных имен продавцов.Я попытался использовать следующее регулярное выражение, но оно возвращает меньше результатов, чем стандартная функция «like» в Netezza SQL.См. Ниже:

Функция SQL Like : где trim (верхний (a.MRCH_NME)), например, '% CNA%' - возвращает 4622 совпадений

Функция регулярного выражения в Netezza SQL : где array_combine (regexp_extract_all (trim (upper (a.MRCH_NME)), '. * CNA \ s', 'i'), '|') = 'CNA' - возвращает 2226соответствия

Я просмотрел два набора результатов и обнаружил, что строки, подобные приведенным ниже, не совпадают:

!C CNA INT ARR
*CNA PLATZ 0400
015764 CNA CRAD
C#CNA PARK 0

Я использовал следующее выражение регулярного выражения: /.* CNA \ s '/

Есть идеи, почему вышеприведенные строки не возвращаются как совпадения?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Мне кажется, проблема скорее в вашем коде, чем в регулярном выражении. Посмотрите: like '%CNA %' возвращает все записи, которые содержат подстроку CNA, за которой следует буквальный пробел в любом месте записи. Регулярное выражение '.*CNA\s' соответствует любым 0+ символам, кроме новой строки, за которыми следуют CNA и ** любые пробельные символы *.

Точность. эта ссылка , \s соответствует "символ пробела. Пробел определяется как [\t\n\f\r\p{Z}].

Таким образом, вы должны просто использовать

WHERE REGEXP_LIKE(MRCH_NME, 'CNA ', 'i')

или, что лучше, с проверкой границы слова:

WHERE REGEXP_LIKE(MRCH_NME, '\bCNA\b', 'i')

, где \b отмечает переход от слова к несловесному и не словесному к словесному символу, обеспечивая тем самым поиск по всему слову и оправдывая использование регулярного выражения.

Если вам не нужно сопоставлять имя продавца как целое слово, используйте обычный LIKE с '%CNA %', это должно быть более эффективным.

0 голосов
/ 16 мая 2018

Вы, вероятно, должны использовать regexp_like:

SELECT *
FROM yourTable
WHERE REGEXP_LIKE(MRCH_NME, 'CNA[ ]', 'i');

Это будет логически идентично следующему запросу с использованием LIKE:

SELECT *
FROM yourTable
WHERE MRCH_NME LIKE '%CNA ';
...