SQL String - удалить подстроку между 2 случаями - PullRequest
0 голосов
/ 29 октября 2018

У меня есть несколько строк вроде:

0@11001@2017@308     
0@1@2018@327          
0@200510@2020@3022

Мне нужно удалить значение года (между последними 2 '@'). Поэтому результаты должны быть такими:

0@11001@308     
0@1@327          
0@200510@3022

Есть простой запрос, чтобы сделать это?

Ответы [ 3 ]

0 голосов
/ 29 октября 2018
UPDATE
  yourTable
SET
  col = STUFF(yourTable.col, AtSign2.pos, atSign3.pos - atSign2.pos, '')
FROM
  yourTable
OUTER APPLY
  (SELECT CHARINDEX('@', yourTable.col,             0)) AS atSign1(pos)
OUTER APPLY
  (SELECT CHARINDEX('@', yourTable.col, atSign1.pos+1)) AS atSign2(pos)
OUTER APPLY
  (SELECT CHARINDEX('@', yourTable.col, atSign2.pos+1)) AS atSign3(pos)
0 голосов
/ 29 октября 2018
DECLARE @STRING VARCHAR(50) = '0@200510@2020@3022'

DECLARE @NEED_TO_REMOVE VARCHAR(50) = PARSENAME(REPLACE(@STRING,'@','.'),2) + '@'

SELECT REPLACE(@STRING,@NEED_TO_REMOVE,'') --result: 0@200510@3022
0 голосов
/ 29 октября 2018

Лучшее, что можно сделать здесь, - это нормализовать ваши данные и прекратить хранить несколько точек данных, встроенных в одну строку, в одном столбце. При этом, если вам необходимо продолжить, мы можем попробовать использовать функции базовой строки, чтобы объединить обновление:

UPDATE yourTable
SET col = LEFT(col, CHARINDEX('@', col, CHARINDEX('@', col) + 1)) +
    REVERSE(LEFT(REVERSE(col), CHARINDEX('@', REVERSE(col)) - 1));

enter image description here

Демо

Обратите внимание, что в этом ответе предполагается, что в каждой записи будет три @ разделителя. Если нет, то мы должны добавить дополнительную логику.

...