/Alpha/papa//Alpha/papa/tango//Alpha/quebec//bravo/papa//bravo/papa/uniform//charlIE/quebec/tango/
如果我搜索/ bravo / papa /下的所有内容,我想得到:
/bravo/papa//bravo/papa/uniform/
我目前正在尝试这样做(请参阅下面的长篇故事,说明为什么我不能使用更简单的方法):
SELECT * FROM files WHERE Path >= '/bravo/papa/' AND Path < '/bravo/papa0';
这有效.它看起来有点奇怪,但它适用于这个例子. ‘0’是大于’/’的unicode代码点1.按字典顺序排序时,以’/ bravo / papa /’开头的所有路径都比它大于’bravo / papa0′.但是,在我的测试中,当我们尝试这个时,我发现这会崩溃:
SELECT * FROM files WHERE Path >= '/' AND Path < '0';
这不会返回任何结果,但应返回每一行.据我所知,问题是sqlite将’0’视为数字,而不是字符串.例如,如果我使用’0Z’而不是’0′,我会得到结果,但我会产生误报的风险. (例如,如果实际上有一个条目’0′.)
我的问题的简单版本是:有没有办法让sqlite在这样的查询中将’0’视为包含unicode字符’0’的长度为1的字符串(它应该排序诸如’!’,’*之类的字符串) ‘和’/’,但在’1′,’=’和’A’之前,而不是整数0(sqlite在所有字符串之前排序)?
我想在这种情况下,我可以通过特殊套管来搜索“/”下的所有内容,因为我的所有条目总是以’/’开头,但我真的想知道如何避免这种事情一般来说,因为它以与JavaScript的“==”运算符相同的方式令人不快地感到惊讶.
第一种方法
更自然的方法是使用liKE或GLOB运算符.例如:
SELECT * FROM files WHERE Path liKE @prefix || '%';
但我想支持所有有效的路径字符,因此我需要使用ESCAPE作为’_’和’%’符号.显然,这可以防止sqlite在Path上使用索引. (参见http://www.sqlite.org/optoverview.html#like_opt)我真的希望能够从这里的索引中受益,并且听起来像使用liKE或GLOB是不可能的,除非我能保证它们的特殊字符都不会出现在目录名中,并且POSIX允许任何其他比Nul和’/’,甚至GLOB的’*’和’?’字符.
我是为上下文提供的.我对解决底层问题的其他方法感兴趣,但我更愿意接受一个直接解决sqlite中字符串 – 看起来像数字 – 的歧义的答案.
类似的问题
How do I prevent sqlite from evaluating a string as a math expression?
在那个问题中,没有引用这些值.即使在作为参数引用或传入值时,我也会得到这些结果.
编辑 – 请参阅下面的答案.该列是使用无效类型“STRING”创建的,sqlite将其视为NUMERIC.
解决方法 *呻吟*.该列具有NUMERIC亲和力,因为它意外地被指定为“STRING”而不是“TEXT”.由于sqlite无法识别类型名称,因此它使其成为NUMERIC,并且由于sqlite不强制执行列类型,因此其他所有内容都按预期工作,除非每次将类似数字的字符串插入该列时它都会转换为数字类型. 总结以上是内存溢出为你收集整理的如何防止SQLite将字符串视为数字?全部内容,希望文章能够帮你解决如何防止SQLite将字符串视为数字?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)