下面是我尝试做的事情的简化版本,它最好地显示了问题。我的数据库看起来像这样:
用户表:
| 用户标识|名字|
| - -|- -|
| 一个|鲍勃|
| 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
我得到了以下输出,这绝对是意料之外的:
| 名字|问候语|
| - -|- -|
| 鲍勃|你好鲍勃!|
| 戴夫|你好鲍勃!|
| 斯蒂文|你好鲍勃!|
有谁知道问题出在哪里,以及如何解决?
1条答案
按热度按时间rbpvctlc1#
我无法解释问题是什么。您可能在数据库引擎中发现了一个bug。我无法访问较新的MariaDB(dbfiddle的较新版本似乎已损坏),但尽管MariaDB 10.3和MySQL 5.5似乎都给出了您的输出,但MySQL 5.6给出了预期的输出,因此bug已被发现并修复。
用连接而不是子查询重写查询似乎在任何引擎中都有效: