1

我编写了下面的小 bash 脚本,它按预期工作,但我添加了几个注释和换行符以提高可读性,这会破坏代码。删除注释和换行符应该使它成为一个有效的脚本。

### read all measurements from the database and list each value only once
sqlite3 -init /tmp/timeout /tmp/testje.sqlite \
  'select distinct measurement from errors order by measurement;' |

### remove the first line of stdout as this is a notification rather than intended output
sed '1d' |

### loop though all found values
while read error; do 

  ### count the number of occurences in the original table and print that
  sqlite3 -init /tmp/timeout /tmp/testje.sqlite \
    "select $error,count( measurement ) from errors where measurement = '$error' ;"
done

结果是这样的:

134         1                   
136         1                   
139         2                   
159         1

问题:是否可以sqlite3while-loop 转换为 SQL 语句?换句话说,sqlite3 是否支持某种for-loop 来遍历先前查询的结果?

现在我知道这sqlite3是一个非常有限的数据库,很可能我想要的东西对它来说太复杂了。我一直在寻找它,但我真的是一个数据库傻瓜,到目前为止我得到的点击要么是在不同的数据库上,要么是在解决一个完全不同的问题。

最简单的答案(我不希望顺便说一句)是“sqlite3 不支持循环”。

4

1 回答 1

7

SQLite 不支持循环。这是整个语言,您会注意到完全没有结构化编程。

然而,这并不是说没有循环就不能得到你想要的东西,而是使用集合或其他一些 SQL 构造。在您的情况下,它可能很简单:

 select measurement, count( measurement ) from errors GROUP BY measurement

这将为您提供表中所有measurements 的列表,errors并计算每个 s 出现的频率。

通常,最好通过在单个(有时是复杂的)SQL 语句中表达您的查询来利用 SQL 引擎,该语句将提交给引擎进行优化。在您的示例中,您已经编写了一些关于用于从数据库获取数据的策略的决策 - 这是 SQL 的一个原则,即引擎比程序员更能做出这些决策。

于 2013-07-26T19:57:59.213 回答