Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在sqlite中对表中逗号分隔的值使用substr_Iphone_Objective C_String_Sqlite - Fatal编程技术网

Iphone 如何在sqlite中对表中逗号分隔的值使用substr

Iphone 如何在sqlite中对表中逗号分隔的值使用substr,iphone,objective-c,string,sqlite,Iphone,Objective C,String,Sqlite,我在SQLITE中的数据库中有一个表,它在位置字段中的x和y坐标为10,10。 我想通过使用select查询分别使用x坐标和y坐标。我知道我们可以使用subtr和charAtIndex来定位位置,但我不知道如何定位? 我是sqlite新手,需要一些帮助来解决这个问题。如果有任何方法可以更改模式,那么应该将x和y坐标存储在单独的、基于数字的字段中。这将提高性能,因为您不需要进行任何子字符串处理并降低查询的复杂性。我怀疑数据库设计中存在缺陷。例如:您正在为矩形设计一个表格,那么坐标应该是单独的属性,

我在SQLITE中的数据库中有一个表,它在位置字段中的x和y坐标为10,10。 我想通过使用select查询分别使用x坐标和y坐标。我知道我们可以使用subtr和charAtIndex来定位位置,但我不知道如何定位?
我是sqlite新手,需要一些帮助来解决这个问题。

如果有任何方法可以更改模式,那么应该将x和y坐标存储在单独的、基于数字的字段中。这将提高性能,因为您不需要进行任何子字符串处理并降低查询的复杂性。

我怀疑数据库设计中存在缺陷。例如:您正在为矩形设计一个表格,那么坐标应该是单独的属性,而不是将它们放在一起。矩形的一行表示矩形的一个实例,其值为坐标、长度和宽度等。
如果您使用如此出色的设计来设计数据库,那么它的操作将非常高效。

SQLite substr函数在这方面并不实用,使用C substr函数有点挑剔。最简单的方法是转换为NSString并使用ComponentSeparatedByString或ComponentSeparatedByCharactersSet返回单个逗号分隔值的简单NSArray,而无需编写任何迭代代码


[但如果您想在该字段上进行选择,您会遇到一个问题-据我所知,没有任何SQLite函数会启用它,除非它可能会像这样使用起来非常笨拙。]

SQLite的字符串函数相当有限,但您滥用其隐式类型转换来拆分字符串。像这样的东西应该可以做到:

select xy + 0 as x,
       substr(xy, length(xy + 0) + 2) as y
from some_table
只要没有任何前导零、空格或内部空格,这种方法就应该有效。加零将值转换为一个数字,因此“10,5”+0仅为10;然后调用length,将其转换回字符串,并给出字符串长度,然后调整该长度以考虑逗号+1和长度偏移+1的变化,您将从“10,5”中得到5

例如:

sqlite> select '10,5' + 0 as x, substr('10,5', length('10,5' + 0) + 2) as y;
x|y
10|5
这就是说,您真的应该重新设计您的模式,为X和Y坐标设置单独的列,在单个列中存储结构化数据通常是个坏主意

更新注释:SQLite还允许您执行以下操作:

select value,
       xy + 0 as x,
       substr(xy, length(xy + 0) + 2) as y
from some_table
where x < 2000
  and y < 2000
甚至:

select value
from some_table
where (xy + 0) < 2000
  and substr(xy, length(xy + 0) + 2) < 2000

这些类型的查询最终会进行完整的表扫描,因此它们对您来说可能太慢了。将您的模式固定为具有单独的X和Y坐标列OTOH将提供快速查询。

正如其他人所指出的,您确实应该将X和Y放在它们自己的列中

如果你做不到这一点,这里有一种获得x的方法:

sqlite> select * from t;
10,10
(11,11)
(12,13)
sqlite> select rtrim(rtrim(ltrim(coord,'('),'0123456789)'),',')  from t;
10
11
12
sqlite> 

获得y也会类似。

如果您有json1扩展,那么可以使用json的函数。如果你的数据真的是10,10。你能行

select
  json_extract(replace(replace(value, '(', '['), ')', ']'), '$[0]') as x,
  json_extract(replace(replace(value, '(', '['), ')', ']'), '$[1]') as y
from myTable
where x >= 10 AND y <= 10
其思想是将数据转换为有效的json,并使用json函数进行处理。
您可以在这里的文档中找到更多函数:

如果您不介意稍微滥用SQLite的类型系统,您可以使用substr。是的,有几个人让我成了一个骗子。我真的很喜欢,虽然我同时鄙视这些聪明的把戏,所以我应该稍微减少我的反应。就把戏而言,聪明和愚蠢之间有一条细微的界限:我们说服他修复他的模式,这样最终一切都会好起来。你使用的是什么编程语言?@Larry:看起来lifemoveson想在where子句中使用坐标,所以在数据库外进行字符串损坏最终将成为客户端表扫描,而不是在数据库表扫描中。我不知道使用SQLite会有多大的不同。charAtIndex让我觉得Objective-C很可能是iOS上的Obj-C。@拉里:对不起,我以前没有看到你的评论,但是是的,因为提到我使用的是Obj-C,mu太短了。@mu太短了:是否可以在where子句中使用相同的逻辑,比如将值10,5与位置x和位置分开。y:从位置x<2000的t中选择值位置y<2000@lifemoveson:是的,你可以这样做,请看我更新的答案。@mu\u太短了:如果y<2000,第二个字符串y没有得到正确的值,但是x给出了正确的值。我不确定我是否需要在这里更改除上述内容以外的任何内容,因为我以前尝试过。@lifemoveson:您的数据实际上是什么样子的?为什么你不能修正你的模式,让它有单独的X和Y列呢?是的,我会这么做,因为这件事也让我抓狂。我认为这是一个更好的解决办法。但是我非常感谢你的帮助。