【问题标题】:iOS:Objective C - Sqlite query to get records which has comma separator values in where clauseiOS:Objective C - Sqlite 查询以获取在 where 子句中具有逗号分隔值的记录
【发布时间】:2019-03-16 10:07:36
【问题描述】:

在我的数据库中,我的记录有一列以逗号分隔的值,如下所示:

我想要那些只有RoomNo = 121 的记录。

如果我使用查询

select ID,RoomNo from RoomTable WHERE RoomNo = 121

select ID,RoomNo from RoomTable WHERE RoomNo LIKE '%121%'

只返回一条记录:

但我希望输出中的第 8、10、11 行。我也试过SET, regexp,但没有运气。

请提出建议。

谢谢。

【问题讨论】:

  • 重新设计您的数据库,使其正确规范化,每行引用单个 (id, room) 对将是最佳解决方案。阅读多对多关系。

标签: ios objective-c sqlite where-clause


【解决方案1】:

就像我在前面的评论中提到的那样,最好的方法是使用适当的数据库设计 - 而不是像 (11, '12,121,20') 这样的一行,而是三行 (11,12)(11,121)(11,20) 所以可以使用简单的WHERE roomno = 121。以 RDBMS 设计的方式存储数据比您正在做的事情要容易得多,后者试图将方形钉钉入圆孔。

但是,如果由于某种原因您无法修复数据...一个逗号分隔的数字列表非常接近 JSON 数字数组,并且 sqlite 有 decent support 用于工作使用 JSON...

所以,给定这张表:

CREATE TABLE rooms(id INTEGER, roomno TEXT);
INSERT INTO rooms VALUES (9, '108'), (11, '12,121,205'), (12, '12,205')
                       , (16, '121'), (17, '121,205'), (20, '205');

这个查询

SELECT *
FROM rooms AS r
WHERE 121 IN (SELECT j.value FROM json_each('[' || r.roomno || ']') AS j)
ORDER BY id

给你

id          roomno    
----------  ----------
11          12,121,205
16          121       
17          121,205  

【讨论】:

    【解决方案2】:

    这应该可以工作

    select * from RoomTable where RoomTable.roomID like '%121%'

    正如您在图片中看到的那样。并且请显示您的代码以了解有关问题的更多信息。

    【讨论】:

    • 如果我的 roomId 为 1210 或 11210,这将无法 100% 工作。
    • 另一种方法是使用类似查询获取所有记录,当您将数据映射到对象时,手动比较它是否包含您想要的内容。
    【解决方案3】:

    我没有使用 SQLite 设置项目,但快速搜索显示它支持 RegEx(正则表达式)。

    你可以试试这个:

    select ID,RoomNo from RoomTable WHERE RoomNo REGEXP '(?<!\d)(121)(?!\d)'
    

    也就是说:RoomNo 包含 121 个的所有记录在数字之前(负后瞻)或后(负前瞻),所以它 匹配 11211210,但它匹配 121,, 121121

    这是https://regex101.com/r/aS8jQ8/27的正则表达式测试器

    编辑:正如“Shawn”所说,这不会“开箱即用”。而且,我不知道iOS中是否可以提供REGEXP函数。

    【讨论】:

    • 关键字是REGEXP 而不是REGEX,并且不支持开箱即用。扩展或语言绑定或程序必须通过该名称提供用户定义的函数来进行匹配。
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多