You can try the following:
WITH yourvalue AS
(
SELECT val FROM t WHERE id = 7
),
downvalue AS
(
SELECT val
FROM t
WHERE val < (SELECT val FROM yourvalue)
ORDER BY val DESC
OFFSET 0 ROWS
FETCH FIRST 1 ROWS ONLY
),
upvalue AS
(
SELECT val
FROM t
WHERE val > (SELECT val FROM yourvalue)
ORDER BY val
OFFSET 0 ROWS
FETCH FIRST 1 ROWS ONLY
)
select * from yourvalue
UNION
select * from downvalue
UNION
select * from upvalue
Output is: 12, 20, 22
I was able to test this only with MS SQL Server 2012. I believe that this is ANSI SQL, but it seems that SQLite does not like the syntax OFFSET/FETCH. So you can try to change from OFFSET 0 ROWS FETCH FIRST 1 ROWS ONLY
to LIMIT 1 OFFSET 0
.