2010-07-11 7 views
0

Вот вопрос:Вам нужна помощь SQL

+--------------+ 
Ships   | 
+--------------+ 
Duke of north | 
---------------+ 
Prince of Wales| 
---------------+ 
Baltic   | 
---------------+ 

Мне нужно заменить все символы между первым и последним пробелами (за исключением этих пространств) символами звездочки (*). Количество звездочек должно быть равно числу замененных символов.

например: «Герцог Севера» должен быть заменен как «герцог ** Север», Мне удалось отрезать «из» от «Герцога Севера», но я действительно застрял с запасной частью, может любой дайте мне некоторые идеи, изучая SQL в MS SQL Server 2005, пожалуйста, помогите. я не нужен точный ответ просто дать мне некоторые идеи,

select 
case when charindex(' ',ship,(charindex(' ',ship,1))+1) > 0 
    then substring(ship,(charindex(' ',ship,1))+1,((charindex(' ',ship,(charindex(' ',ship,1))+1)) - (charindex(' ',ship,1)))) 
end "Replace" 
from 
outcomes 

Это не домашнее задание вопрос, учусь SQL.

+1

Итак, если «Герцог Севера» станет «герцогом ** Север», чего вы ожидаете от «Балтики» и «Корабли»? –

+0

CHARINDEX вернет положение первого символа пробела. Вам нужно будет использовать эту функцию дважды, используя местоположение первого экземпляра в качестве отправной точки для второй проверки ... –

+0

Обычно это связано с заменой регулярного выражения, которое на SQL Server 2005+ требует использования функции CLR –

ответ

1
select 
isnull(case when charindex(' ',ship,(charindex(' ',ship,1))+1) > 0 
    then substring(ship,1,charindex(' ',ship,1))+space(1)+replace(substring(ship,(charindex(' ',ship,1))+1,((charindex(' ',ship,(charindex(' ',ship,1))+1)) - (charindex(' ',ship,1)))),substring(ship,(charindex(' ',ship,1))+1,((charindex(' ',ship,(charindex(' ',ship,1))+1)) - (charindex(' ',ship,1)))),replicate('*',len(substring(ship,(charindex(' ',ship,1))+1,(charindex(' ',ship,(charindex(' ',ship,1))+1)) - (charindex(' ',ship,1))))))+space(1)+substring(ship,(charindex(' ',ship,(charindex(' ',ship,1))+1)),(len(ship))) 
end,ship) "Replace" 
from 
outcomes 

После долгих попыток я получил ответ самостоятельно!

1

Часть обучения SQL - это научиться определять задачи, которые должны выполняться в SQL не. Это должно быть оставлено как часть логики отображения и должно оставаться в стороне от механизма базы данных.

+1

Что вы имеете в виду? Я использую SQL все время, чтобы увидеть, находятся ли даты в пределах диапазона. –

+1

http://thedailywtf.com/Articles/A-Better-Date-Diff.aspx –

+1

Значит, вам никогда не приходилось обновлять значение столбца для замены текста? –

3
SELECT 
CASE WHEN ship NOT LIKE '% % %' THEN ship 
ELSE 
LEFT(ship,CHARINDEX(' ',ship)) + 
     REPLICATE('*', LEN(ship)- CHARINDEX(' ',REVERSE(ship)) - CHARINDEX(' ',ship)) + 
     RIGHT(ship, CHARINDEX(' ',REVERSE(ship))) 
END 
FROM outcomes 

Если вам обычно нужно выбрать данные в этой модифицированной форме, вы можете добавить вычисленный столбец, как показано ниже.

ALTER TABLE dbo.outcomes ADD 
    displayName AS CASE WHEN ship NOT LIKE '% % %' THEN ship 
ELSE 
LEFT(ship,CHARINDEX(' ',ship)) + 
     REPLICATE('*', LEN(ship)- CHARINDEX(' ',REVERSE(ship)) - CHARINDEX(' ',ship)) + 
     RIGHT(ship, CHARINDEX(' ',REVERSE(ship))) 
END PERSISTED 
Смежные вопросы