Eu tenho uma única coluna que contém informações que preciso dividir em três colunas separadas. Atualmente, tenho uma instrução SELECT que funciona parcialmente, mas minha coluna ChangeTo não está retornando nenhum dado e não consigo descobrir por que. Aqui está a aparência da coluna atual que está sendo retornada:
| 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" |
Aqui estão como eu preciso que os resultados retornem:
| ChangeType | ChangeFrom | ChangeTo |
-----------------------------------------------------
| changed status from | new | in progress |
| changed ORT status from | in progress | Code Review |
| changed MileStone from | 1.1 | 1.2 |
Aqui estão como os resultados estão retornando agora:
| ChangeType | ChangeFrom | ChangeTo |
-----------------------------------------------------
| changed status from | new | |
| changed ORT status from | in progress | |
| changed MileStone from | 1.1 | |
Aqui está a consulta que estou usando:
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
Agradeço antecipadamente!
O REVERSE está limpando nossa string, não tenho certeza do porquê.
EDIT: Aqui está o porquê. Nesta sequência a string 'to' é na verdade 'ot'. (Ken cortou no meio da edição!)
Fixo:
Aqui está uma abordagem alternativa.
Simples o suficiente. Quando você usou o inverso, continuou a procurar por 'TO'. Se você mudar para 'OT', funcionará bem. Para sua informação, não sei por que você tem todos os CONVERTs lá, mas provavelmente não precisa deles.
Para sua informação, não sei por que você tem todos os CONVERTs lá, mas provavelmente não precisa deles.
Se você achar que precisa deles, coloque algo nos comentários junto com a versão do SQL que está usando e talvez eu possa simplificar um pouco as coisas para você.
EDIT: Tenho certeza de que isso funcionará a partir de 2005 e simplifica um pouco o código. Pode ser útil se sua consulta for um pouco mais complicada do que o que você está mostrando. Basicamente, estou pressionando CONVERT e REPLACE e CHARINDEX('from') em um CROSS APPLY. Em ambos os casos, você está usando as funções várias vezes e, dessa forma, pode executá-las uma vez e apenas chamá-las conforme necessário. Além disso, isso significa que, se você precisar alterar algo, precisará fazê-lo em um só lugar.