Функция поиска по почтовому индексу, подобная SQL

#regex #apache-spark #apache-spark-sql

#регулярное выражение #apache-spark #apache-spark-sql

Вопрос:

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

SQL

 Select distinct Postcode from tableA where like 'NE1%';
 

Показывает 2 почтовых индекса, все начинающиеся с NE1

Я пробовал :-

 Select distinct Postcode from tableA where rlike '^NE[0-1]%'
 

Показывает много почтовых индексов, включая 2 сверху, например NE27 0EZ — я предполагаю, потому что во 2-й части почтового индекса есть ноль, но понятия не имею, почему появляется NE2 2NE!

Моя цель — отфильтровать все почтовые индексы, которые начинаются с N (не NE), НО имеют только числовое значение в качестве следующего символа — только SQL, а не python или scala, поскольку этот фильтр формирует 1 из многих фильтров почтовых индексов (большое предложение OR)

Я бы подумал, что для всех почтовых индексов, начинающихся с N, которые имели числовое значение в качестве следующего символа, сработали бы :-

 Select distinct Postcode from tableA where rlike 'N[0-9] %' or 'N[0-9][0-9] %' 



select distinct 'rlike' as Func , postcode from npex.npex where postcode rlike '^NE[0-1]*'
union
select distinct 'like', postcode from npex.npex where postcode like 'NE1%'
order by 1;

RESULTS
Func    postcode    
like    NE1 3BB    
like    NE12 1AB

rlike   NE27 0EZ    
rlike   NE6 2UT    
rlike   NE27 0LT    
rlike   NE12 1AB    
rlike   NE2 2NE    
rlike   NE3 4DT    
rlike   NE1 3BB
 

Ответ №1:

* не требуется, иначе вы бы сопоставили 0 или более нулей или единиц.

 select distinct postcode from npex.npex where postcode rlike '^NE[0-1]'
 

Если вы хотите получить те, которые начинаются с N, за которым следует число, вы можете использовать

 select distinct postcode from npex.npex where postcode rlike '^N[0-9]'