Well, one way is that you can make a sub-query that uses a recursive CTE to 
find it. I've got something that appears to work, but it seems overly 
convoluted, so I'm going to feel embarrassed when someone posts a simple 
elegant version in a couple minutes.


Say for example you have

create table stuff (full_str text);
insert into stuff values ('Here kitty kitty kitty');

Then if you're looking for 'kitty' and want the start of instance #2 you could 
do this... (Using binding methods of your platform where appropriate)


select full_str, 'kitty' as looking_for, 2 as instance_no, 
coalesce(
  (with recursive foo
  (instance_no, instance_start, remaining_str, remaining_str_pos)
  as (values (0, 0, stuff.full_str, 0)
  union all
  select instance_no + 1,
  remaining_str_pos + instr(remaining_str, 'kitty'),
  substr(remaining_str, instr(remaining_str, 'kitty') + length('kitty')),
  remaining_str_pos + instr(remaining_str, 'kitty') - 1 + length('kitty')
  from foo where instr(remaining_str, 'kitty'))
  select instance_start from foo where instance_no = 2),
  0) as instance_start
from stuff;


sqlite> ...
QUERY PLAN
|--SCAN TABLE stuff
`--CORRELATED SCALAR SUBQUERY 3
   |--CO-ROUTINE 2
   |  |--SETUP
   |  |  `--SCAN CONSTANT ROW
   |  `--RECURSIVE STEP
   |     `--SCAN TABLE foo
   `--SCAN SUBQUERY 2
full_str                looking_for  instance_no  instance_start
----------------------  -----------  -----------  --------------
Here kitty kitty kitty  kitty        2            12


Or if you're looking for an instance that's more than the number that there 
actually is, this returns 0. Or whatever value you want, just make it the 
second part of the coalesce.

full_str                looking_for  instance_no  instance_start
----------------------  -----------  -----------  --------------
Here kitty kitty kitty  kitty        4            0




-----Original Message-----
From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] On 
Behalf Of Bart Smissaert
Sent: Tuesday, May 14, 2019 3:02 PM
To: General Discussion of SQLite Database
Subject: [sqlite] Instr(x, y, z) ?

Is it possible with the existing SQL core string functions to find the
position of occurrence z of string y in string x?
The standard Instr function only does this for the first occurrence, but I
would like to specify the second, third, fourth etc. occurrence of the
specified string.
As this is with Android coding I can't make a UDF for this.

Alternatively, I could try something similar to InstrRev (as in VB6),
finding the last occurrence of string y in string x.

RBS
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to