在SQLite中查询

时间:2011-03-09 11:59:53

标签: sqlite

“IN”查询无效。如果我错了,请指导我。

KaizenResultsInformationTable是具有字段“recordinfo”的MasterTable,该字段包含Child表ID作为字符串。 kaizenResultsRecordInformationTable是具有字段“recordId”的Childtable。

我必须匹配孩子的记录。

查询:

select recordinfo from KaizenResultsInformationTable

输出:; 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10

查询:

select substr(replace(recordinfo,';','","'),3,length(recordinfo))   
from KaizenResultsInformationTable`

输出:“0”,“1”,“2”,“3”,“4”,“5”

此查询无效:

select * from kaizenResultsRecordInformationTable 
where substr(recordid,0,2) in (
    select substr(replace(recordinfo,';','","'),3,length(recordinfo))
    from KaizenResultsInformationTable
)

此查询有效:

select * from kaizenResultsRecordInformationTable 
where substr(recordid,0,2) in ("0","1","2","3","4","5")

1 个答案:

答案 0 :(得分:3)

你不能那样使用in。在第二个查询中,您将传递in一个包含以逗号分隔的值列表的字符串。

最好将ID列表表示为每个值的一条记录。

另外,我不确定你为什么要记录你的记录字符串。您通常应该每列存储一个值。

但是,如果您无法更改架构,则可以使用字符串匹配“like”而不是“in”。这样的事情应该有效:

select a.* from kaizenResultsRecordInformationTable a
join KaizenResultsInformationTable b 
  on (';'+b.recordinfo+';') LIKE ('%;'+trim(substr(recordid,0,2))+';%')

因此,如果您的recordinfo看起来像1;2;3;4;5;6,而您的substr(recordid,0,2)看起来像1,那么";1;2;3;4;5;6;" LIKE "%;1;%"就会包含该行,这是真的。