Nazywa się to chodzeniem po łańcuchu . Oto przykład, jak możesz to zrobić z dostarczonymi specyfikacjami:
Będziesz musiał stworzyć tabelę zawierającą tyle liczb całkowitych, ile wynosi długość pola + 1. Więc jeśli długość pola wynosi 255, będziesz potrzebować 256 rekordów, które zawierają tylko jedną liczbę z zakresu 0-255.
int_table
:
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+---+
Następnie będziesz potrzebować zapytania, które łączy się w tej tabeli i sprawdza, czy przecinek istnieje w tej lokalizacji, czy nie. (Nazwałem twoją tabelę legacy_table
z polami client
i items
, odpowiednio.)
select
legacy_table.client,
substring(
legacy_table.items,
int_table.i + 1,
if(
locate(',', legacy_table.items, int_table.i + 1) = 0,
length(legacy_table.items) + 1,
locate(',', legacy_table.items, int_table.i + 1)
) - (int_table.i + 1)
) as item
from legacy_table, int_table
where legacy_table.client = 'xyz001'
and int_table.i < length(legacy_table.items)
and (
(int_table.i = 0)
or (substring(legacy_table.items, int_table.i, 1) = ',')
)
Może nie być wystarczająco wydajny, abyś mógł z niego korzystać, ale pomyślałem, że przedstawię go jako przykład, abyś wiedział, co jest dostępne.