2016-04-07 29 views
2

Veritabanımızda + ayrılmış dizgiler içeren bir tablonuz var. Her satırın toplamını seçmek için zaten var mı? yani, 5212667+5212662; 10425329'u seçmek istiyorum.SQL: bir + ayrılmış listenin bir tamsayıya dönüştürülmesi

CONVERT(INT, ColumnAddList)'u denedim, ancak bu işe yaramadı. Eğer SQL Server kullanıyorsanız

+1

Lütfen sorunuz olan veritabanında etiketleyin. Ayrıca, örnek verileri * ve * istenen sonuçları sağlayın. –

+0

select 5212667 + 5212662 Bu, int çevrimiçine dönüştürmez dönüştürücüdür – mohan111

+0

Veriler bu gibi cevap vermez. Sadece size bir sürü sorun çıkarır. – jarlh

cevap

5

sen bölünmüş ve toplamını hesaplamak olabilir:

CREATE TABLE tab(ID INT IDENTITY(1,1), col VARCHAR(1000)); 

INSERT INTO tab(col) VALUES('5212667+5212662'),('1+2+3'),('2'), (NULL), ('1+-1'); 

SELECT * 
FROM tab 
CROSS APPLY (
    SELECT [result] = SUM(Split.a.value('.', 'BIGINT')) 
    FROM (SELECT [X] = CAST ('<M>'+REPLACE(col, '+', '</M><M>') + '</M>' AS XML)) AS A 
    CROSS APPLY X.nodes ('/M') AS Split(a) 
) AS s; 

LiveDemo

Çıktı:

╔════╦═════════════════╦══════════╗ 
║ ID ║  col  ║ result ║ 
╠════╬═════════════════╬══════════╣ 
║ 1 ║ 5212667+5212662 ║ 10425329 ║ 
║ 2 ║ 1+2+3   ║ 6  ║ 
║ 3 ║ 2    ║ 2  ║ 
║ 4 ║ NULL   ║ NULL  ║ 
║ 5 ║ 1+-1   ║ 0  ║ 
╚════╩═════════════════╩══════════╝ 

Doğru yol, tablo şemanızı normalize etmektir.

3
CREATE FUNCTION dbo.fnSplit(
@sInputList VARCHAR(8000) -- List of delimited items 
, @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items 
) RETURNS @List TABLE (item VARCHAR(8000)) 

BEGIN 
DECLARE @sItem VARCHAR(8000) 
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 
    BEGIN 
    SELECT 
    @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX 
     (@sDelimiter,@sInputList,0)-1))), @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX 
     (@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) 

    IF LEN(@sItem) > 0 
    INSERT INTO @List SELECT @sItem 
    END 

IF LEN(@sInputList) > 0 
    INSERT INTO @List SELECT @sInputList -- Put the last item in 
    RETURN 
    END 
GO 

declare @table table (Val varchar(2000)) 
insert into @table values('1+1+1+') 
insert into @table values('2+2+2+') 
insert into @table values('3+3+3+') 
insert into @table values('4+4+4+') 
select Val, (select sum(convert(decimal(10,2),item)) from dbo.fnSplit(val,'+')) as summ from @table 

Bu yardımcı olur umarım !!!

Mutlu Kodlama !!!

+0

Bu, ancak bu tür splitterin korkunç derecede verimsiz olmasına neden olur. Sınırlandırılmış dizeleri ayırmak için döngüye başvurmaya gerek yoktur. İşte daha iyi seçeneklerin sayısı. http://sqlperformance.com/2012/07/t-sql-queries/split-strings –

+0

Ancak, ortak tablo işlevine sahip çözüm herkes için genel bir çözümdür ve sağladığınız bağlantının birçok çözümü vardır, ancak tümü özel tabloyla ilgilidir. ya da tablo sütunu ve genel değil. Ve cevabımdaki son sorguyu yürüttükten sonra gerçek yürütme planına bakarsanız, bu bağlantıdan –

+1

HUH ??? İçindeki ayrıştırıcılar jenerik. Burada yayınlanan while döngü splitter de genel ama korkunç yavaş. –

İlgili konular