SQL选择字符串中每个特定字符每次出现后的第一个字符

问题描述:

我试图创建一个字符串,其中包含字符串的第一个字符以及字符串中特定字符出现后的第一个字符。例如,如果'。'是特定字符,'Hello.Bye.Today.Yesterday'应该返回'HBTY'。SQL选择字符串中每个特定字符每次出现后的第一个字符

我到目前为止有:

SELECT substring(Hello.Bye.Today.Yesterday, 1,1) 
+0

你已经有了什么代码? –

+0

首先,这不是一个SQLish任务,所以数据库不是最佳工具。其次,您需要用您正在使用的数据库标记问题。 –

+0

如果你知道C#中的'split'# – LONG

如果你想使用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”表达式来“装饰”你的代码来捕捉那个......