用于替换模板中多对多表中的多个值的SQL查询

用于替换模板中多对多表中的多个值的SQL查询,sql,postgresql,replace,many-to-many,Sql,Postgresql,Replace,Many To Many,我想在sql查询中转换模板。假设有以下四个表:state、stateProperty、state\u stateProperty和translation: state\u stateproperty |---------------------|--------------------| | state_id | stateproperties_id | |---------------------|--------------------| | 1

我想在sql查询中转换模板。假设有以下四个表:state、stateProperty、state\u stateProperty和translation:

state\u stateproperty

|---------------------|--------------------|
|      state_id       | stateproperties_id |
|---------------------|--------------------|
|          1          |        2           |
|---------------------|--------------------|
|          1          |        3           |
|---------------------|--------------------|
|---------------------|------------------|
|  id  |     key      |      value       |
|------|--------------|------------------|
|  2   | ${firstName} |      John        |
|------|--------------|------------------|
|  3   | ${lastName}  |      Doe         |
|------|--------------|------------------|
stateproperty

|---------------------|--------------------|
|      state_id       | stateproperties_id |
|---------------------|--------------------|
|          1          |        2           |
|---------------------|--------------------|
|          1          |        3           |
|---------------------|--------------------|
|---------------------|------------------|
|  id  |     key      |      value       |
|------|--------------|------------------|
|  2   | ${firstName} |      John        |
|------|--------------|------------------|
|  3   | ${lastName}  |      Doe         |
|------|--------------|------------------|
状态

|---------------------|
|  id  |  template    |
|------|--------------|
|  1   |  template    |
|------|--------------|
翻译

|------------|--------------|---------------------------------|
|  language  |  messageId   |             value               |
|------------|--------------|---------------------------------|
|  en        |  template    | ${lastName}, ${firstName} alarm |
|------------|--------------|---------------------------------|

其目的是获取一个名为translatedstate的新实体,该实体包含状态的已翻译模板。在本例中,翻译后的模板类似于:“Doe,John alarm”。如何在本机sql中联接多对多表,并将状态模板与其相关状态属性的值进行转换?

老实说,我将创建一个小函数,在该函数中循环遍历您的
状态属性
,并用其文本替换找到的通配符字符串


但我在一个查询中找到了一些解决问题的乐趣。我不确定它是否匹配所有特殊情况,但对于您的示例,它是有效的:

  • 简单地将这些表连接在一起(下次您可以稍微简化示例,这样我们就不必创建这些不同的表。我相信您知道如何连接)
  • 几乎不需要将
    ${state}
    变量替换为state
    nameid
  • 这会在每次找到
    ${
    字符串时分割模板字符串。因此它会创建一个以某个通配符开头的新行。请注意,
    ${firstName}
    将变为
    firstName}
    ,因为字符串分隔符正在被删除
  • 添加一个行计数以获得一个条件,即当我稍后聚合行时,这些行是如何排序的(8)。只作为
    FROM
    子句的一部分工作,因此整个函数在这里添加了一个连接
  • 由于(3)的原因,我也从键中去掉了
    ${
    部分,这样以后可以更好地解析和比较它(在6中)
  • 因为(3)创建了太多的行(交叉连接),所以我只需要
    是拆分字符串的第一个通配符的行。所有其他行都是错误的
  • 现在我用这个键替换通配符
  • 因为我们每行只有一个通配符,所以我们需要再次将它们合并成一个字符串(按
    state_id
    分组)。为了获得正确的顺序,我们使用(5)中的行号

  • @这有帮助吗?如果有,请不要忘记投票(这是对作者为您所做的工作的一种荣誉,具有一定的内在可信度)。如果它不仅有帮助,而且完全正确,您应该接受。这表明其他人不需要做任何工作,因为您的问题已经解决。由于我的查询要大得多,我尝试将您的查询集成到我的查询中。但到目前为止,我无法使其工作。错误:t.value列不存在第22行:regexp\u split\u to\u table(t.value,'\$\{')作为split_键,提示:可能您想引用列“sp.value”。错误消息准确地告诉您问题所在:别名t没有列。在我的示例中,t用于表转换。也许您有另一个别名?我理解错误消息,但我只是将您的精确查询复制到我的中。也许我应该更新我的帖子并添加完整的查询。啊,我明白了。这是我的错。使用了行。\u numb在通过表进行扩展之前使用er()函数。因此,在扩展之后,所有元素都获得相同的行号,因此聚合以随机顺序进行。现在,为了避免子查询,我使用了WITH ORDINALITY功能(我认为这是有史以来第一次使用:D)来创建行号。现在看起来不错。