Jakub Panas

Jakub Panas Konsultant
techniczny,
IPR-Insights

Temat: [DB2] predykat LIKE lub równoważny

Witam,
DB2 wersja 8.5 na solarisie 8 64-bit, kodowanie UTF.
mam dwie tabele:
TMP z polem KOD typu varchar 13
oraz
OPAK z polem OPIS typu varchar 750

potrzebuję wyciągnąć listę wierszy z OPAK, które w polu OPIS mają ciąg znaków z pola KOD
Zapytanie:
select
TMP.KOD,
OPAK.ID
from TMP,
OPAK
WHERE
OPAK.OPIS = ('%' || TMP.KOD || '%')
order by TMP.KOD;
Zwraca pusty wynik (dane testowe są tak wstawione, że powinny wyjść 3 wiersze).

zamiana '=' na 'LIKE'
OPAK.OPIS LIKE ('%' || TMP.KOD || '%')
zwraca błąd:
QL0132N Predykat LIKE lub funkcja skalarna POSSTR są niepoprawne, ponieważ
pierwszy operand nie jest wyrażeniem łańcuchowym lub drugi operand nie jest
łańcuchem. SQLSTATE=42824

Odwrotna kolejność porównania ('%' || TMP.KOD || '%') LIKE OPAK.OPIS daje taki sam błąd.

Czy da się to sprawdzić jednym zapytaniem/warunkiem.
Pozdrawiam,
Jakub Panas
Damian L.

Damian L. Architekt IT

Temat: [DB2] predykat LIKE lub równoważny

Drugi operand nie może zawierać kolumny. Może spróbuj z LOCATE, ale to tylko luźna sugestia, bo na db2 nie znam się wcale :)Damian L. edytował(a) ten post dnia 20.02.12 o godzinie 17:19

konto usunięte

Temat: [DB2] predykat LIKE lub równoważny

Spróbuj:

select
t.KOD,
o.ID
from TMP t
join opak o on LOCATE(t.KOD, o.OPIS)>0

lub

select
t.KOD,
o.ID
from TMP t
join opak o on POSITION(t.KOD, o.OPIS)>0

Przy okazji jeśli posiadasz wersję 8.x to warto przejść na 9.7. Wersje 8.x nie są już wspierane przez IBM.Marcin Molak edytował(a) ten post dnia 20.02.12 o godzinie 17:48
Jakub Panas

Jakub Panas Konsultant
techniczny,
IPR-Insights

Temat: [DB2] predykat LIKE lub równoważny

Dzięki,

LOCATE zadziałało dokładnie tak jak potrzebowałem.

Przejście na 9.7 planowane jest po połowie roku, przenosimy się na W2K8.
DB2 9 wymaga Solarisa 9/10, ale nie mam szans na jego upgrade.

konto usunięte

Temat: [DB2] predykat LIKE lub równoważny

Spróbuj bez nawiasów. Like na DB2 działa jak najbardziej z kolumnami.
Możesz też spróbować z substr(), jeśli znasz długość wartości (albo ją obliczyć):

and i1.cola like '%'||substr(i2.cola,1,4)||'%'

Następna dyskusja:

przeniesienie danych z Oral...




Wyślij zaproszenie do