SQL选择字符串中每个特定字符每次出现后的第一个字符
问题描述:
我试图创建一个字符串,其中包含字符串的第一个字符以及字符串中特定字符出现后的第一个字符。例如,如果'。'是特定字符,'Hello.Bye.Today.Yesterday'应该返回'HBTY'。SQL选择字符串中每个特定字符每次出现后的第一个字符
我到目前为止有:
SELECT substring(Hello.Bye.Today.Yesterday, 1,1)
答
如果你想使用SQL为此,创建一个函数有以下逻辑
DECLARE @value VARCHAR(255)
SET @value = 'Hello.Bye.Today.Yesterday'
DECLARE @result VARCHAR(255)
DECLARE @curChar CHAR(1)
DECLARE @start INT, @end INT
SET @start = 2
SET @end = LEN(@value)
SET @result = SUBSTRING(@value, 1,1)
WHILE @start < @end
BEGIN
SET @curChar = SUBSTRING(@value, @start, 1)
IF @curChar = '.'
BEGIN
SET @result = @result + SUBSTRING(@value, @start + 1, 1)
SET @start = @start + 1
END
SET @start = @start + 1
END
结果
HBTY
答
如果您数据库支持INSTR()函数,这将工作。但是,正如Gordon Linoff指出的那样,关系数据库中的这种活动是有限的。正如你看到的,你必须硬线:
- 中第一个字符
- 的每一个可能发生;“”第一,第二,第三...
没那么容易......
-- use '+' instead of '||' in SQL Server
WITH
input(s) AS (SELECT 'Hello.Bye.Today.Yesterday')
SELECT
SUBSTR(s,1,1)
||SUBSTR(s,INSTR(s,'.',1,1)+1,1)
||SUBSTR(s,INSTR(s,'.',1,2)+1,1)
||SUBSTR(s,INSTR(s,'.',1,3)+1,1)
AS the_string
FROM input;
the_string
HBTY
所以,你必须第一个字符来连接一个特殊的行为;那么,你必须在正确的时间点停止SUBSTR(s,INSTR(s,'.',1,<n>)+1,1)
,所以你必须事先知道''。发生在字符串中。 让我们看看会发生什么,如果我们去一个过去的结束:
WITH
input(s) AS (SELECT 'Hello.Bye.Today.Yesterday')
SELECT
SUBSTR(s,1,1)
||SUBSTR(s,INSTR(s,'.',1,1)+1,1)
||SUBSTR(s,INSTR(s,'.',1,2)+1,1)
||SUBSTR(s,INSTR(s,'.',1,3)+1,1)
||SUBSTR(s,INSTR(s,'.',1,4)+1,1) -- there is no 4th '.'
||SUBSTR(s,INSTR(s,'.',1,5)+1,1) -- there is no 5th '.'
AS the_string
FROM input;
the_string
HBTYHH
所以INSTR()返回0,那么,你得到的字符串每次第一个字符。你将不得不用“CASE WHEN”表达式来“装饰”你的代码来捕捉那个......
你已经有了什么代码? –
首先,这不是一个SQLish任务,所以数据库不是最佳工具。其次,您需要用您正在使用的数据库标记问题。 –
如果你知道C#中的'split'# – LONG