SQLite:使用单独的表进行动态键值替换

Posted

技术标签:

【中文标题】SQLite:使用单独的表进行动态键值替换【英文标题】:SQLite: dynamic key-value REPLACE using separate table 【发布时间】:2019-12-28 13:52:37 【问题描述】:

使用 SQLite,我想替换字符串中的多个占位符,但不是静态提供键值对,占位符和替换值必须来自表。这个问题最好用例子来说明:

SELECT
  REPLACE( REPLACE( REPLACE( text_with_placeholders
  , '$NAME', 'Eren')
  , '$TITLE','Mr')
  , '$LEVEL','4th')
FROM table_with_text

不过,就我而言,我有一个相当长的占位符列表,理想情况下它们是动态的,从而简化了添加和更改值。因此,我不想更改查询,而是想在键值表中添加/更新记录。

关于如何解决这个难题有什么聪明的主意吗?也许是为了灵感,到目前为止,我的(死胡同)道路是使用 SQLite 不错的 group_concat() 函数,这与交叉连接一起使您能够将带有文本的行和键对值作为字符串放在同一行上.但是你仍然需要某种循环来遍历它们,这样就行不通了。

      SELECT
        REPLACE( REPLACE( REPLACE( text_with_placeholders
        , '$NAME', 'Eren')
        , '$TITLE','Mr')
        , '$LEVEL','4th')
        , kv.keys
        , kv.vals
      FROM table_with_text
CROSS JOIN ( SELECT GROUP_CONCAT(key) keys, GROUP_CONCAT(val) vals FROM key_val_table ) kv

我知道这个问题的答案可能是不可能的,这没关系。不过,鉴于 *** 的许多聪明才智,我还是想试一试。

我也知道最好在目标应用程序中完成,而不是在数据库中。所以没有必要指出这一点。

【问题讨论】:

【参考方案1】:

您好,我认为您的想法 “而不是更改查询,我想在键值表中添加/更新记录”

但我认为你应该一步一步来:

首先阅读您的键值表 构建查询命令(检查结果) 执行动态查询命令

replace-function 可用于将表格的内容设置为您拥有的查询模式!

这里是一个使用替换的例子:

UPDATE
    contacts
SET
    phone = REPLACE(phone,'410','+1-410');

参考:http://www.sqlitetutorial.net/sqlite-replace-function/

【讨论】:

感谢您的回答,基本上您的建议是将解决方案移出数据库,这是一个好方法。但是,我特别希望仅在数据库中解决此问题。

以上是关于SQLite:使用单独的表进行动态键值替换的主要内容,如果未能解决你的问题,请参考以下文章

交叉表查询中的日期顺序 - 使用单独的表进行排序

可以使用两个单独的 SQLite 数据库吗?

SQL:如何从单独的表动态计算值?

SQL注入之bWAPP之sqli_11.php

如何动态替换sql中的表名

sqli lab 23 24