Bunu nasıl başaracağımı söyleyen var mı? Masamdaki bir sütun, bazı durumlarda virgülle ayrılmış değerler içerir. Eğer varsa, bu değerler için yeni satırlar oluşturmalıyım. Ayrıca, örnek olarak, bir tablo 1 satır ve 4 sütun Col1 içerir. Üste | Col2 | Col3 | Aşağıdaki değerlerle Col4 A | B | C | Sırasıyla 1,2,3. Yani, Col4 '1,2,3' dizesini içerir ve ben virgülle ayrılmış değerleri kırmalı ve bunları kendi satırlarına yerleştirmeliyim, böylece tablo 1 satır ve 1 2 ve 3'ün kendi satırlarının olduğu 1 sıra içerecektir. Col4'te.Bir sütunu birden çok satıra ayırma
cevap
ben bunu düşünüyorum:
SELECT
T.id, RIGHT(LEFT(T.csv,Number-1),
CHARINDEX(',',REVERSE(LEFT(','+T.csv,Number-1))))
FROM
master..spt_values,
your_table T
WHERE
Type = 'P' AND Number BETWEEN 1 AND LEN(T.csv)+1
AND
(SUBSTRING(T.csv,Number,1) = ',' OR SUBSTRING(T.csv,Number,1) = '')
Kod utanmadan this site çalındı.
Bazı büyük alan değerleri için işe yaramamış olmasına rağmen, yine de harika bir fikirdir (spt_values'i değiştirmek için bir geçici tablo kullanılır). – Umer
Bir tablo işlevi yazıp, sütununuza CROSS APPLY
ile katılabilirsiniz. İşte benim versiyonum.
CREATE FUNCTION dbo.Splitter(@text nvarchar(max), @separator nvarchar(100))
RETURNS @result TABLE (i int, value nvarchar(max))
AS
BEGIN
DECLARE @i int
DECLARE @offset int
SET @i = 0
WHILE @text IS NOT NULL
BEGIN
SET @i = @i + 1
SET @offset = charindex(@separator, @text)
INSERT @result SELECT @i, CASE WHEN @offset > 0 THEN LEFT(@text, @offset - 1) ELSE @text END
SET @text = CASE WHEN @offset > 0 THEN SUBSTRING(@text, @offset + LEN(@separator), LEN(@text)) END
END
RETURN
END
Komut dosyanızı çalıştırmak, "Geçersiz nesne adı 'splitter'" hatasını üretir. Hangi ayırıcı işlevini değiştirmeyi teklif edersiniz? –
İyi yakalama! –
Bir çok dize ayırma işlevinden biri de dışarıda çalışır. Bu, @Byron Whitlock'un answer'a benzer, ancak master..spt_values kullanmak yerine bir sayı tablosu oluşturmak için bir cte kullanır. SQL Server 2005'ten itibaren.
CREATE TABLE dbo.Table1
(
Col1 CHAR(1),
Col2 CHAR(1),
Col3 CHAR(1),
Col4 VARCHAR(50)
)
GO
INSERT INTO dbo.Table1 VALUES ('A','B','C','1,2,3')
GO
SELECT * FROM dbo.Table1;
GO
WITH
L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
L1 AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
L2 AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
L3 AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
Numbers AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L3)
SELECT Col1, Col2, Col3,
LTRIM(RTRIM(SUBSTRING(valueTable.Col4, nums.n, charindex(N',', valueTable.Col4 + N',', nums.n) - nums.n))) AS [Value]
FROM Numbers AS nums INNER JOIN dbo.Table1 AS valueTable ON nums.n <= CONVERT(int, LEN(valueTable.Col4)) AND SUBSTRING(N',' + valueTable.Col4, n, 1) = N','
+1 wow oluşturmak için alter değiştirdim, runnable kodu için teşekkürler. Ben de en zarif çözüm olarak beğendim –
Bir kenar çubuğunun bir parçası olarak, aslında çok fazla, daha yavaş olacak bir tekrarlayıcı CTE değil. –
@Jeff Moden İyi nokta, buna göre değiştirildi –
Bunun eski bir yayın olduğunu biliyorum ancak bir güncelleştirme ekleyeceğimi düşündüm. Tally Table ve cteTally tablo tabanlı bölücülerin hepsi büyük bir soruna sahiptir. Birleştirilmiş sınırlayıcılar kullanırlar ve elemanlar genişledikçe ve ipler daha uzun hale geldiklerinde hızlarını öldürürler.
Bu sorunu çözdüm ve URL'yi takip edende bulabileceğiniz bir makale yazdım. http://www.sqlservercentral.com/articles/Tally+Table/72993/
Ben de "Peter" adlı bir adam (makale için tartışmaya) bile bu kodu bir iyileştirme yaptığını anlatacağım. Makale hala ilginç ve ekleri ertesi gün veya iki gün içinde Peter'ın geliştirmeleri ile güncelleyeceğiz. Büyük geliştirmemle Peter'in yaptığı tweek arasında, VARCHAR'ı bölmek için daha hızlı bir T-SQL-Only çözümü bulacağına inanmıyorum (8000). Aynı zamanda VARCHAR (MAX) için bölücülerin sorununu da çözdüm ve bunun için de bir makale yazdım.
- 1. Birden çok satıra yayılacak etiketler
- 2. Bir öğenin birden çok yinelemesini sözlüğe ayırma
- 3. Bir sütunu birden çok sütuna bölme
- 4. jQuery dizgileri, birden çok satıra yayılmış biçimlendirmelidir
- 5. Birden çok satıra bölünmüş Ruby regex
- 6. Etiket Birden çok satıra sahip metin hizalama
- 7. Birden çok satıra karşı denetleme geçerlilik kuralı
- 8. SQL sorgusu Bazı sınırlayıcılara göre satırda birden çok satıra bölünmesi
- 9. Bir dizi panda komutunu birden çok satıra bölmek mümkün mü?
- 10. TSQL: Bir ID'nin birden çok satıra sahip olması nasıl sağlanır?
- 11. Haskell - Bir fonksiyonun birden çok satıra uygulanmaya çalışılması
- 12. Birden çok satırı, bash stdout'ta bir satıra nasıl dönüştürebilirim?
- 13. Bir html etiketinin birden çok satıra bölünüp ayrılmadığı nasıl belirlenir
- 14. Veri kümesindeki birden çok sütunu R
- 15. DataTables'ta birden çok sütunu nasıl arayabilirim?
- 16. Birden Çok MySQL Sütunu ve Satırının Birleştirilmesi
- 17. Birden çok farklı sütunu, Spark Dataframe scala
- 18. Pandalar, DataFrame: Birden çok sütuna bir sütun ayırma
- 19. Bir döngüde birden çok tablodaki bir sütunu güncelleştirme
- 20. birden çok sütun içine sözlükler bir pandalar sütunu Bölünmüş
- 21. Birden çok sütunu pandalarda başka bir sütuna bölme
- 22. MySQL Birden çok sütunu bir 'geçici' sütuna birleştirin
- 23. Tek bir sql sorgusunda koşullu birden çok sütunu nasıl güncelleyeceğiniz
- 24. Aynı anda birden çok satıra boşluk ekleme - Pycharm içinde
- 25. Apache Pig Latin'de birden çok satıra komuta ayırabilir miyim?
- 26. Birden çok değişkene birden çok sütun seçin
- 27. dışsal ayırma çok büyük
- 28. Birden çok satırı birden çok satıra dönüştürmek için excel makrosu (VBA)
- 29. Matlab grafikleri içindeki başlığı birden çok satıra nasıl bölme
- 30. Pandalar Birden çok hedef sütunu sütunlara birden çok hedef sütuna dönüştürün
SQL Server'da bu mu? Hangi sürümü lütfen? –
Tek sütunlar içindeki virgülle ayrılmış değerler ** yanlış **. Lütfen şemayı tamir etmek için çalıştığını söyle? –
Bir sütunu birden çok satıra bölen çok daha büyük bir sorununuz var. Veritabanınızda MAJOR tasarım hatası var. –