10

大多数关系数据库都有某种REPEAT()字符串函数,例如:

SELECT REPEAT('abc', 3)

会产生

abcabcabc

另一方面,SQLite 的功能集非常有限。SQLite 支持的函数在这里列出:

http://www.sqlite.org/lang_corefunc.html

可以REPEAT()用 SQLite 中可用的功能进行模拟吗?

4

4 回答 4

8

一个解决方案的灵感来自这个对相关问题的回答,这里:

如何使用 SQLite 模拟 LPAD/RPAD

我想在 Stack Overflow 上分享这个,因为这可能对其他 SQLite 用户有用。解决方案是这样的:

-- X = string
-- Y = number of repetitions

replace(substr(quote(zeroblob((Y + 1) / 2)), 3, Y), '0', X)
于 2012-07-19T20:10:43.103 回答
5

如果要重复单个字符,可以使用printf函数。

贝娄是一个*重复10次数的例子。

sqlite> select printf('%.' || 10 ||'c', '*');
**********

要重复多个字符,请参阅上面 Lukas 的回答。

于 2019-01-03T23:25:01.030 回答
4

@Lukas Eder 使用 hex() 而不是引号的解决方案的简化版本:

-- X = string
-- Y = number of repetitions

replace(hex(zeroblob(Y)), '00', X) 
于 2018-08-10T18:39:08.930 回答
2

我的回答结合了Shiplu Mokaddim 的 “printf 字符替换重复”Steve BrobergLukas Eder的“替换” :

sqlite> SELECT replace(printf('%.' || 5 || 'c', '/'),'/','My string ');
My string My string My string My string My string      

从表数据中推导出重复次数也很容易。下面是一个使用公用表表达式的示例:

sqlite> WITH cte(string, reps) AS
    ..>   (SELECT * FROM (values ('alpha ', 1),('bravo ', 5),('charlie ', 3) ) )
    ..> SELECT *, replace(printf('%.' || reps || 'c', '/'), '/', string) FROM cte;
alpha       1           alpha
bravo       5           bravo bravo bravo bravo bravo
charlie     3           charlie charlie charlie
于 2020-05-02T12:22:23.860 回答