【问题标题】:SQL Replace in select with left join左连接选择中的SQL替换
【发布时间】:2016-07-08 10:25:37
【问题描述】:

我有以下查询可以正常工作:

SELECT 'User ID' AS 'uid',
       'E-Mail' AS 'email',
       'Reason' AS 'reason'
UNION ALL
SELECT a.subid AS 'uid',
       a.email AS 'email',
       b.data AS 'reason'
FROM sms7l_subscriber a
LEFT JOIN sms7l_history b ON a.subid = b.subid
WHERE (a.confirmed = 0
       OR a.enabled = 0
       OR a.accept = 0)
  AND b.action = unsubscribed

现在我想直接在 b.data 上做一些字符串替换......它包含一个相当难读的字符串,例如- 'REASON::UNSUB_SURVEY_FREQUENT REASON::UNSUB_SURVEY_IRRELEVANT REASON::Some text from textfield'

我想用 'Reason:' 替换 'REASON::' 并用相应的字符串替换 'UNSUB_SURVEY_FREQUENT' 等。我需要在 'b.data' 上进行大约 4-5 个字符串替换

我尝试了以下方法:

SELECT 'User ID' AS 'uid',
       'E-Mail' AS 'email',
       'Reason' AS 'reason'
UNION ALL
SELECT a.subid AS 'uid' , a.email AS 'email',
REPLACE (b.data,
         'REASON::',
         'Reason: ') AS 'reason'
FROM sms7l_subscriber a
LEFT JOIN sms7l_history b ON a.subid = b.subid
WHERE (a.confirmed = 0
       OR a.enabled = 0
       OR a.accept = 0)
  AND b.action = unsubscribed

但它不起作用。不幸的是,我必须在单个查询中执行此操作,并且它必须包含替换。有关如何正确包装替换命令的任何提示都会很棒。

更新:感谢您迄今为止的意见。以下是我错过的一些附加信息,可能会引起一些混乱: 这是一个 MySQL 数据库,我不想实际替换数据库本身中的字符串或创建一个新表 - 我只想替换查询结果中的字符串。这背后的原因:我使用的 cms 有一个非常方便的工具,它允许我将 mysql 查询的结果呈现为格式良好的 html 表(它是可排序的、可搜索的等)。 不幸的是,我只能使用一个查询,并且不能调用任何进一步的程序来格式化查询结果。结果的第一行可以设置为标题,因此可以在我的查询开头设置“union all”语句。因为我希望表格易于阅读,所以我想替换(翻译)“b.data”上的字符串。例如。而不是“REASON::UNSUB_SURVEY_IRRELEVANT”,我想要“原因:时事通讯的内容不再让我感兴趣”......“REASON::UNSUB_SURVEY_FREQUENT”应该得到相应的翻译......

我希望即使 SQL 查询最终变得相当复杂,它也能节省我为我的 cms 编写适当的模块。

错误信息:

1064 You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near... (and than comes the query string).

(感谢 SQL 查询的格式更改 - 现在更好阅读)。

【问题讨论】:

  • 不起作用是什么意思?
  • 什么 RDBS? Microsoft SQL Server、Postgres、Oracle....?
  • 你说 “我需要在 'b.data' 上进行大约 4-5 次字符串替换”,但这里只显示了一个 REPLACE 语句。你能显示消息错误吗?

标签: mysql sql select replace left-join


【解决方案1】:

您必须执行UPDATE 查询来更改您的数据,并且此更新不需要列标题上的UNION

    UPDATE sms7l_subscriber a 
    LEFT JOIN sms7l_history b ON a.subid = b.subid 
    SET b.data = REPLACE (b.data,  'REASON::','Reason: ')
    WHERE (a.confirmed = 0 or a.enabled = 0 or a.accept = 0) and b.action = unsubscribed

这是标准 ANSI,因为您没有指定 RDBMS

【讨论】:

  • 对不起,如果我不清楚:我不需要表中的数据 - 更重要的是我有一个非常方便的工具,可以将单个 sql 查询的结果呈现为一个很好的可排序表对于我使用的 cms。这就是为什么我在第一列中添加标题与“联合”所有以及为什么我要替换一些字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 2018-06-23
  • 2014-04-08
  • 1970-01-01
相关资源
最近更新 更多