我可能又在做一些愚蠢的事情,但我不理解下面查询中的参数替换。该列
char_len
声明为整数。
Tcl变量
selEnd
在SQLite查询中,它被替换为字符串,因为该查询返回所有行,就好像条件始终为true一样。我应该写的
selENd
显示在查询中
UNION ALL
在里面
WHERE
线
and p.char_len + p.char_bgn <= :selEnd
。
如果
selEnd
已更改为
set selEnd [expr {799+1}]
则只返回应该返回的行。
如果在CLI或SQLite Fiddle中使用
.param set :selEnd 800
然后
selEnd
被视为整数。如果我只是打字
800
而不是
:selEnd
则返回正确的行。
If变量
SQL
使用双引号而不是大括号设置,并且条件更改为使用
$selEnd
第页,共页
:selEnd
,将返回正确的行。
我有什么不理解的结果
:selEnd
被视为
'800'
而不是
800
使用大括号设置时
SQL
?
我以为Tcl把所有的东西都当作字符串,直到它被“用来”做某事。和
SQL
只是一个字符串
selEnd
将插入为
800
;但是,似乎
:selEnd
-类型参数替换决定
selEnd
是一个字符串,应插入为
'800'
为什么?
非常感谢。
set docId 1
set selStart 500
set selEnd 800; #[expr {799+1}]
set SQL {\
with recursive
pieces( order_idx, doc_id, key, buffer_id, char_start, char_len, char_bgn ) as
(
select
0,
r.*,
0
from
pt_pointers r
where
r.key = (select order_keys->>0 from ur_maps where doc_id = :docId)
and r.doc_id = :docId
UNION ALL
select
order_idx + 1,
r.*,
p.char_len + p.char_bgn
from pt_pointers as r, pieces p
where r.key = (select order_keys->>(order_idx+1) from ur_maps where doc_id = :docId)
and p.char_len + p.char_bgn <= :selEnd
and r.doc_id = :docId
)
select *
from pieces;\
}
db eval $SQL {
chan puts stdout "$order_idx, $doc_id, $key, $buffer_id, $char_start, $char_len, $char_bgn"
}