2017-03-16 3 views
0

文字列の最初の文字とその文字列内の特定の文字が現れるたびに最初の文字を含む文字列を作成しようとしています。たとえば、 '。' 'Hello.Bye.Today.Yesterday'は 'HBTY'を返します。私がこれまで持って何文字列内の特定の文字が出現するたびに最初の文字を選択します。

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

あなたはすでにどのようなコードをお持ちですか? –

+0

まず、これはSQLのタスクではないため、データベースは最適なツールではありません。次に、使用しているデータベースで質問にタグを付ける必要があります。 –

+0

もしあなたがCの中で 'split'を知っているなら# – LONG

答えて

0

あなたはこのために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 
0

あなたの場合はデータベースは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)に行くことをやめなければならないので、事前にどのくらいの頻度で 'を知る必要があります。'文字列内で発生します。 のは、我々は終わりを越え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式を使用してコードを「装飾」する必要があります。

関連する問題