以下是问题:
+--------------+
Ships |
+--------------+
Duke of north |
---------------+
Prince of Wales|
---------------+
Baltic |
---------------+
我需要用星号(*)的符号替换第一个和最后一个空格(不包括这些空格)之间的所有字符。星号的数量必须等于替换的字符数。
例如:“北方公爵”必须更换为“Duke ** North”, 我设法从“北方公爵”中删除了“of of”,但我确实坚持使用替换部分,任何人都可以给我一些想法,我在MS SQL Server 2005中学习SQL,请帮忙。 我不需要确切的答案只是给我一些想法,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。
答案 0 :(得分: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
答案 1 :(得分:1)
学习SQL的一部分是学习识别不在SQL中执行的任务。这应该留在显示逻辑的一部分,并且应该远离数据库引擎。
答案 2 :(得分: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
经过长时间的尝试,我自己得到了答案!