SQLite and Lua: Selecting column data from given row

时间:2016-04-04 18:59:19

标签: sqlite lua

How can i get value from one column in SQLite? Example, i have column named houseNames and want to get value from third row, how can i do that?

2 个答案:

答案 0 :(得分:0)

编辑后很难说出你的主要目的是什么 但它似乎你试图搜索lua的sqlite3包装器。 根据我的经验,lsqlite3将有利于您的需求。

至于你的问题,这个库的主要用途是使用迭代器完成的:

local sqlite3 = require("lsqlite3")

local db = sqlite3.open_memory()

for row in db:nrows("SELECT * FROM test") do
  print(row.id, row.content)
end

所以你甚至可以通过比列号更方便的列名获得你想要的任何细节。

从db中获取第n行:

local sqlite3 = require("lsqlite3")

local db = sqlite3.open_memory()
local stmt = db:prepare("SELECT * FROM Players")
local maxRowNumber = 6
for rowNumber=1, maxRowNumber do
    stmt:step()
    row = stmt:get_named_values()
end

不要按原样使用此代码,我只是写了一个简单的例子,你应该首先阅读api of lsqlite3,并检查每个函数的sqlite3返回码。

答案 1 :(得分:0)

另一种方法是使用SQLite直接提取给定的行。你显然需要一些方法来确定第三行的含义,例如是由rowid,其他一些字段,houseName按字母顺序排序等等。

注意:数据库中的行没有任何固有的顺序(理论上至少),甚至没有添加行的顺序,即使它看起来如此,也无法保证SELECT-ed行将是除非给出ORDER BY条款,否则不得以任何预期的顺序返回。

完成后,您可以使用LIMIT子句两次来获取所需的行。您需要一个带有子查询的查询。

在子查询中,您将结果限制为您要查找的行号(例如,3)。在外部查询中,您按相反的方向排序,并且LIMIT为1.

示例:

-- assumes lsqlite3 already loaded as sqlite3

db = sqlite3.open(':memory:')

sql = [[
create table t(houseNames text);

insert into t values('a'),('b'),('c'),('d'),('e'),('f');
]]

db:exec(sql)

sql = [[
select houseNames from (select houseNames from t order by houseNames limit 3)
  order by houseNames desc
  limit 1;
]]

for house_name in db:urows(sql) do
  print(house_name)
end

db:close()

您还可以使用带有OFFSET子句的LIMIT并避免子查询:

sql = [[
select houseNames from t order by houseNames limit 1 offset 2
]]