table1
:
code | category |
---|---|
ABC | ZMLND_XY_ABC |
table2
:
category | label |
---|---|
MLND | 3 |
ZMLND | 4 |
I'd like to map table1
's category
to table2
's label
if the part of table1
's category
separated by _
equals table2
's category
. For example, ZMLND_XY_ABC
in table1
matches ZMLND
in table2
while ZMLND_XY_ABC
and MLND
does not.
Query:
select * from table1 left join table2 on '_'||table1.category||'_' like '%_'||table2.category||'_%'
Result:
code | category | category_1 | label
ABC | ZMLND_XY_ABC | MLND | 3 <- _MLND_ should not match
_ZMLND_XY_ABC_
ABC | ZMLND_XY_ABC | ZMLND | 4
However, I replace _
by ,
:
table1
:
code | category |
---|---|
ABC | ZMLND,XY,ABC |
select * from table1 left join table2 on ','||table1.category||',' like '%,'||table2.category||',%'
Result:
code | category | category_1 | label |
---|---|---|---|
ABC | ZMLND,XY,ABC | ZMLND | 4 |
Why are there different results?
CodePudding user response:
Because of SQLITE like
the _
is as special a character as the %
.
As you seem to know, the %
matches multiple characteres.
What you seem to have missed is that the _
matches any single character.
Compare e.g. https://www.sqlitetutorial.net/sqlite-like/
Have a look at https://www.sqlite.org/lang_expr.html concerning the ESCAPE
optional syntax part, which probably can help you to write your query.