mariadb 在MySQL中对select中的字符串使用replace和列数据会导致不同行的输出相同

kkih6yb8  于 2022-11-08  发布在  Mysql
关注(0)|答案(1)|浏览(150)

下面是我尝试做的事情的简化版本,它最好地显示了问题。我的数据库看起来像这样:
用户表:
| 用户标识|名字|
| - -|- -|
| 一个|鲍勃|
| 2个|戴夫|
| 三个|斯蒂文|
设置表:
| 姓名|价值|
| - -|- -|
| 格式字符串|您好{名字}!|
现在我想检索format_string,其中插入了每个用户的用户数据。如果我将my format_string硬编码到SQL中,就可以这样工作:

SELECT first_name,
REPLACE(
    "Hello {first_name}!",
    "{first_name}",
    first_name
)
AS greeting
FROM users

我得到了预期的输出:
| 名字|问候语|
| - -|- -|
| 鲍勃|你好鲍勃!|
| 戴夫|你好,戴夫!|
| 斯蒂文|你好史蒂文!|
但如果我使用设置表中的format_string,如下所示:

SELECT first_name,
REPLACE(
    (SELECT value FROM settings WHERE name = "format_string"),
    "{first_name}",
    first_name
)
AS greeting
FROM users

我得到了以下输出,这绝对是意料之外的:
| 名字|问候语|
| - -|- -|
| 鲍勃|你好鲍勃!|
| 戴夫|你好鲍勃!|
| 斯蒂文|你好鲍勃!|
有谁知道问题出在哪里,以及如何解决?

rbpvctlc

rbpvctlc1#

我无法解释问题是什么。您可能在数据库引擎中发现了一个bug。我无法访问较新的MariaDB(dbfiddle的较新版本似乎已损坏),但尽管MariaDB 10.3和MySQL 5.5似乎都给出了您的输出,但MySQL 5.6给出了预期的输出,因此bug已被发现并修复。
用连接而不是子查询重写查询似乎在任何引擎中都有效:

SELECT REPLACE(settings.value, "{first_name}", users.first_name) as greeting
FROM
  users,
  settings
WHERE settings.name = 'format_string';

相关问题