我有一个列包含我需要拆分成三个单独列的信息。我目前有一个部分工作的 SELECT 语句,但我的 ChangeTo 列没有返回任何数据,我无法理解为什么。这是当前返回的列的样子:
| bp_comment |
----------------------------------------------------------
| changed status from "new" to "in progress" |
| changed ORT status from "in progress" to "Code Review" |
| changed MileStone from "1.1" to "1.2" |
以下是我需要返回结果的方式:
| ChangeType | ChangeFrom | ChangeTo |
-----------------------------------------------------
| changed status from | new | in progress |
| changed ORT status from | in progress | Code Review |
| changed MileStone from | 1.1 | 1.2 |
以下是现在返回结果的方式:
| ChangeType | ChangeFrom | ChangeTo |
-----------------------------------------------------
| changed status from | new | |
| changed ORT status from | in progress | |
| changed MileStone from | 1.1 | |
这是我正在使用的查询:
SELECT
LEFT(CONVERT(VARCHAR(MAX), bp.bp_comment), CHARINDEX(' from ', CONVERT(VARCHAR(MAX), bp.bp_comment)) + 5) AS 'ChangeType'
,REPLACE(SUBSTRING(CONVERT(VARCHAR(MAX), bp.bp_comment), CHARINDEX(' from ', CONVERT(VARCHAR(MAX), bp.bp_comment)) + 5, CHARINDEX(' to ', CONVERT(VARCHAR(MAX), bp.bp_comment)) - CHARINDEX(' from ', CONVERT(VARCHAR(MAX), bp.bp_comment)) - 5), '"', '') AS 'ChangeFrom'
,REPLACE(RIGHT(CONVERT(VARCHAR(MAX), bp.bp_comment), CHARINDEX(' to ', REVERSE(CONVERT(VARCHAR(MAX), bp.bp_comment)))), '"', '') AS 'ChangeTo'
FROM
bug_posts bp
先感谢您!
REVERSE 正在清除您的字符串,不完全确定原因。
编辑:这就是原因。在此序列中,字符串“to”实际上是“ot”。(肯在编辑过程中狙击了它!)
固定的:
这是另一种方法。
很简单。当您使用反向时,您继续搜索“TO”。如果您将其切换为“OT”,则它可以正常工作。仅供参考,我不确定为什么你有所有的转换,但你可能不需要它们。
仅供参考,我不确定为什么你有所有的转换,但你可能不需要它们。
如果您确实发现需要它们,请在评论中添加一些内容以及您正在使用的 SQL 版本,我也许可以为您简化一些事情。
编辑:我很确定这将在 2005 年及以后工作,并且它在某种程度上简化了代码。如果您的查询比您显示的要复杂得多,可能会有所帮助。基本上,我将 CONVERT 和 REPLACE 以及 CHARINDEX(' from ') 推入 CROSS APPLY。在这两种情况下,您都会多次使用这些函数,这样您就可以运行一次并根据需要调用它们。这也意味着如果您需要更改某些内容,您只需在一个地方进行。