Кто-нибудь может сделать лучше?
sqlite> .schema
CREATE TABLE IF NOT EXISTS "hex2val" (
"hex" TEXT NOT NULL,
"val" INTEGER NOT NULL,
PRIMARY KEY("hex")
);
CREATE TABLE power (x int primary key not null, power not null);
sqlite> select * from hex2val;
0|0
1|1
2|2
3|3
4|4
5|5
6|6
7|7
8|8
9|9
A|10
B|11
C|12
D|13
E|14
F|15
sqlite> select * from power;
1|1
2|16
3|256
4|4096
5|65536
Выполнение:
WITH str as (
select 1 pos, '0' value, 1 len UNION ALL
select 2 pos, '21F' value, 3 len UNION ALL
select 3 pos, '3B51' value, 4 len UNION ALL
select 4 pos, 'FFFF' value, 4 len
),
cnt as (WITH recursive cnt(idx) AS (SELECT 1 UNION ALL SELECT idx+1 FROM cnt LIMIT (select max(len) maxlen from str)) select * from cnt)
select pos, value, sum(val * power)
FROM str, cnt, hex2val, power
where idx <= len
and hex = substr(value, idx, 1)
and x = len -idx + 1
group by pos
Результат:
1 0 0
2 21F 543
3 3B51 15185
4 FFFF 65535
Я хочу удалить избыточность для 'str' - она должна содержать только строки.
И я хотел бы избавиться от вспомогательных таблиц «hex2val» и «power» для отсутствующей функции преобразования и функции pow ().