需要有关此SQL的帮助

时间:2010-07-11 06:37:20

标签: sql sql-server sql-server-2005 tsql string

以下是问题:

+--------------+
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。

3 个答案:

答案 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

经过长时间的尝试,我自己得到了答案!