0

次の形式の文字列を変更しようとしています:

"12_7,34_22,28_4,6_22"

"12,34,28,6"

基本的に、文字列から「_」(アンダースコアとその後とコンマの前にあるもの)を削除したいと考えています。SQLを扱ったことがないので、私には困難な作業のように見えます。

4

4 に答える 4

1
CREATE FUNCTION DeUnderscore(@s nvarchar(max))
RETURNS nvarchar(max)
AS
BEGIN
    DECLARE @iu int = CHARINDEX('_', @s); -- position of _
    DECLARE @ic int = CHARINDEX(',', @s, @iu) -- position of ,  
    WHILE (@iu != 0)
    BEGIN
        IF @ic = 0 SET @ic = LEN(@s) + 1; -- if there's no , go to end of string
        SET @s = STUFF(@s, @iu, @ic - @iu, ''); -- replace everything after _ and before , with ''
        SET @iu = CHARINDEX('_', @s);
        SET @ic = CHARINDEX(',', @s, @iu)
    END 
    RETURN @s
END

..使用中は次のようになります..

SELECT dbo.DeUnderscore(myValue) AS myCleanedValue FROM myTable;
于 2012-07-20T19:18:21.807 に答える
0

whileループなしでこのソリューションを試してください

declare @str varchar(30)='12_7,34_22,28_4,6_22,8_545'

;with cte (startPos,strg) as(
 select CHARINDEX('_',@str,1) [startPos],cast(@str as varchar(500)) as [strg]
 union all
 select CHARINDEX('_',[strg],[startPos])+1 [startPos],cast(stuff([strg],
 CHARINDEX('_',[strg],[startPos]),CHARINDEX(',',[strg],
 [startPos])-CHARINDEX('_',[strg],[startPos]),'') as varchar(500)) as [strg] 
 from cte
 where  CHARINDEX('_',[strg],[startPos])>0
)
select substring(MIN(strg),1,CHARINDEX('_',MIN(strg),1)-1) from cte
于 2012-07-25T11:20:52.087 に答える
0

これを試して:

DECLARE @str varchar(100)='12_7,34_22,28_4,6_22'
DECLARE @out varchar(100)=''
While(CHARINDEX('_',@str,1) > 0)
begin
SET @out=@out+LEFT(REPLACE(@str,SUBSTRING(@str,CHARINDEX('_',@str,1),CHARINDEX(',',@str,1)-CHARINDEX('_',@str,1)),''),CHARINDEX(',',REPLACE(@str,SUBSTRING(@str,CHARINDEX('_',@str,1),CHARINDEX(',',@str,1)-CHARINDEX('_',@str,1)),'')))
SET @str=RIGHT(REPLACE(@str,SUBSTRING(@str,CHARINDEX('_',@str,1),CHARINDEX(',',@str,1)-CHARINDEX('_',@str,1)),''),LEN(REPLACE(@str,SUBSTRING(@str,CHARINDEX('_',@str,1),CHARINDEX(',',@str,1)-CHARINDEX('_',@str,1)),''))-CHARINDEX(',',REPLACE(@str,SUBSTRING(@str,CHARINDEX('_',@str,1),CHARINDEX(',',@str,1)-CHARINDEX('_',@str,1)),'')))

end
select @out+@str
于 2012-07-25T07:39:59.923 に答える
0

MySQL で独自の関数を定義する方法を確認したい場合があります。これにより、DB 固有の文字列操作関数を利用して目的の結果を出力できる一連のコマンドを関数内に書き出すことができます。たとえば、myStringFunction のような関数を定義し、その関数内ですべてのアンダースコアとコンマのインデックス位置を見つけてから、目的の部分文字列を取り出してそれらを再び連結することができます。クエリでの使用法は次のようになります。

SELECT myStringFunction(field_name) FROM テーブル;

于 2012-07-20T18:40:32.543 に答える