次の形式の文字列を変更しようとしています:
"12_7,34_22,28_4,6_22"
に
"12,34,28,6"
基本的に、文字列から「_」(アンダースコアとその後とコンマの前にあるもの)を削除したいと考えています。SQLを扱ったことがないので、私には困難な作業のように見えます。
次の形式の文字列を変更しようとしています:
"12_7,34_22,28_4,6_22"
に
"12,34,28,6"
基本的に、文字列から「_」(アンダースコアとその後とコンマの前にあるもの)を削除したいと考えています。SQLを扱ったことがないので、私には困難な作業のように見えます。
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;
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
これを試して:
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
MySQL で独自の関数を定義する方法を確認したい場合があります。これにより、DB 固有の文字列操作関数を利用して目的の結果を出力できる一連のコマンドを関数内に書き出すことができます。たとえば、myStringFunction のような関数を定義し、その関数内ですべてのアンダースコアとコンマのインデックス位置を見つけてから、目的の部分文字列を取り出してそれらを再び連結することができます。クエリでの使用法は次のようになります。
SELECT myStringFunction(field_name) FROM テーブル;