Jakub
Panas
Specjalista,
URPL,WMiPB
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.
Programista, Asseco
Business Solutions
S.A.
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
Marcin
Molak
Scalam bity by
budować bajty :)
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
Specjalista,
URPL,WMiPB
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.
Piotr
L.
IT - projekt &
implementacje
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)||'%'
