Query z wyrażeniem regularnym

Query z wyrażeniem regularnym

Wątek przeniesiony 2022-12-05 10:20 z Algorytmy i struktury danych przez Riddle.

OR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 37
0

Jak zastosować wyrażenie regularne aby znaleźć słowo:

Kopiuj
MA .... CS 

I teraz o co mi chodzi pierwsze dwa i dwa ostatnie znaki muszą się zgadzać. Środek nie jest ważny. Wielkość liter nie powinna być uwzględniona.
Przykład:

MAfdflfCS - wynik OK
MAfellglCT - wynik błędny
CTfffCS - wynik błędy
MAcosCS - wynik poprawny

Wyróżniłem dużą literą aby było widać schemat. W całej bazie nie koniecznie się taki powtórzy.

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5591
1

Jaka baza? Dla PostgreSQLa coś w rodzaju

Kopiuj
SELECT * 
  FROM my_table
 WHERE my_column ~* 'MA(\w)*CS'  

Dokumentacja

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1135
4

@KamilAdam: A nie wystarczyłoby select * from my_table where my_column like 'MC%CS'?

PD
  • Rejestracja: dni
  • Ostatnio: dni
1

W sql-u jest operator LIKE, gdzie możesz używać znaków % - żaden lub wiele różnych znaków lub _ - jeden znak

Kopiuj
select * from tabela where kolumna like 'MA%CS' /*wszystkie rekordy, dla których wartość pola kolumna 
zaczyna się od MA a kończy na CS, np. MACS, MaasdasCS*/
select * from tabela where kolumna like 'MA_%CS' /*wszystkie rekordy, dla których wartość pola kolumna 
zaczyna się od MA a kończy na CS i pomiędzy zawiera przynajmniej jeden znak, np. MA2CS, MaasdasCS*/
KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5591
1
Dregorio napisał(a):

@KamilAdam: A nie wystarczyłoby select * from my_table where my_column like 'MC%CS'?

ilike, ale racja. zabardzo się nakręciłem na wyrażenie regularne.

S4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1268
2

Like jest ok ale jest mało wydajny i nie użyje żadnych indeksów:

Kopiuj
SELECT * 
  FROM my_table
 WHERE left(my_column,2) = 'MA'   and rigth(my_column,2) = 'CA'

Na upartego na to można nałożyć indeksy.

FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 223
0
S4t napisał(a):

Like jest ok ale jest mało wydajny i nie użyje żadnych indeksów:

Kopiuj
SELECT * 
  FROM my_table
 WHERE left(my_column,2) = 'MA'   and rigth(my_column,2) = 'CA'

Na upartego na to można nałożyć indeksy.

Niby czemu miałby nie użyć? Jeśli silnik będzie miał do dyspozycji indeks, którego użycie w konkretnym przypadku będzie rokowało skróceniem czasu przygotowania danych, to go użyje.

ZD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2310
0

@ortoraf:

W kwesti formalnej, wyszukiwanie z maską (w bazach zwane like) nie jest tej samej mocy co wyrażenie regularne. Ale w tak wąskim przypadku bez znaczenia

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.