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

Query z wyrażeniem regularnym

0

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

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.

1

Jaka baza? Dla PostgreSQLa coś w rodzaju

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

Dokumentacja

4

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

1

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

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*/
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.

2

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

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.

0
S4t napisał(a):

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

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.

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1