Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Soru : MySQL Veritabanı' nda Explode İşlemi Nasıl Yapılır
#1
Merhaba Arkadaşlar,

code        values
------       ---------
10           a,b,c
15           d,e,f
20           x,y,z

şeklinde bir tablom var. Satırdaki values kısmını recordset olarak alıp aşağıdaki gibi nasıl gösterebilirim ?

code       values
------      ---------  
10             a
10             b
10             c
15             d
15             e
15             f
20             x
20             y
20             z

Daha önce kullanmış olabilirim. group_concat fonksiyonu tam tersini yapıyordu diye biliyorum...
Cevapla
#2
(21-03-2018, Saat: 17:25)mad85 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba Arkadaşlar,

code        values
------       ---------
10           a,b,c
15           d,e,f
20           x,y,z

şeklinde bir tablom var. Satırdaki values kısmını recordset olarak alıp aşağıdaki gibi nasıl gösterebilirim ?

code       values
------      ---------  
10             a
10             b
10             c
15             d
15             e
15             f
20             x
20             y
20             z

Daha önce kullanmış olabilirim. group_concat fonksiyonu tam tersini yapıyordu diye biliyorum...

Yapılır ama işlemler uzar ben bu tarz işlemleri sqle Cross apply ile yaptiriyorum + hız

(21-03-2018, Saat: 18:57)narkotik Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(21-03-2018, Saat: 17:25)mad85 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba Arkadaşlar,

code        values
------       ---------
10           a,b,c
15           d,e,f
20           x,y,z

şeklinde bir tablom var. Satırdaki values kısmını recordset olarak alıp aşağıdaki gibi nasıl gösterebilirim ?

code       values
------      ---------  
10             a
10             b
10             c
15             d
15             e
15             f
20             x
20             y
20             z

Daha önce kullanmış olabilirim. group_concat fonksiyonu tam tersini yapıyordu diye biliyorum...

Yapılır ama işlemler uzar ben bu tarz işlemleri sqle Cross apply ile yaptiriyorum + hız
Select code,DATA from tablo cross apply(select split(tablo.values,',') AS DATA)
gibi bir kullanimi vardi bilgisayar basinda olsam denerdim
Split için link
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#3
CREATE TABLE mad85 (
 code INT,
 _values VARCHAR(25)
);

INSERT INTO mad85 VALUES
(10, 'a,b,c'),
(15, 'd,e,f'),
(20, 'x,y,z');

SELECT
 mad85.code,
 SUBSTRING_INDEX(SUBSTRING_INDEX(mad85._values, ',', harfler.harf), ',', -1) _values
FROM
 (SELECT 1 harf UNION ALL SELECT 2
  UNION ALL SELECT 3 UNION ALL SELECT 4) harfler INNER JOIN mad85
 ON CHAR_LENGTH(mad85._values)-CHAR_LENGTH(REPLACE(mad85._values, ',', '')) >= harfler.harf-1
ORDER BY
 code, harf
There's no place like 127.0.0.1
WWW
Cevapla
#4
Sorunun çözümüne uygun bir öneri veremeyeceğim ama; verdiğiniz örnekteki tablo, tam olarak Veritabanı Normalizasyon kurallarına aykırı bir tablo. Öncelikle bu tarz yapılardan kurtulmak daha faydalı olacaktır.

Bu Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol'nın incelenmesi faydalı olabilir.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#5
Bir fonksiyon yardımıyla daha sade ve taşınabilir bir yapıya kavuşturulabilir fakat hissedilmese de bunun performans açısından biraz yan etkisi olacaktır;

DROP FUNCTION IF EXISTS `sm_fn_str_split`;
DELIMITER //
CREATE FUNCTION `sm_fn_str_split`
( `Metin` VARCHAR(255)
, `Ayrac` VARCHAR(10)
, `Konum` INT
)
RETURNS VARCHAR(255)
BEGIN
 RETURN
 REPLACE( SUBSTRING( SUBSTRING_INDEX(Metin , Ayrac , Konum)
                   , CHAR_LENGTH( SUBSTRING_INDEX(Metin, Ayrac, Konum - 1) ) + 1
                   )
        , Ayrac
        , ''
        ); 
END//

DELIMITER ;

DROP   TABLE IF EXISTS TAGLAR;
CREATE TABLE TAGLAR 
      (  ID      INT
      ,  TAGS    VARCHAR(255)
      ) ENGINE = MEMORY;

INSERT INTO TAGLAR( ID, TAGS )
          VALUES ( 10, 'a,b,c' )
               , ( 15, 'd,e,f' )
               , ( 20, 'x,y,z' )
               ;

SELECT   ID, sm_fn_str_split( TAGS , ',' , 1) as Tag FROM TAGLAR UNION
SELECT   ID, sm_fn_str_split( TAGS , ',' , 2) as Tag FROM TAGLAR UNION
SELECT   ID, sm_fn_str_split( TAGS , ',' , 3) as Tag FROM TAGLAR 
ORDER BY ID, Tag
;
Cevapla
#6
(22-03-2018, Saat: 00:13)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
CREATE TABLE mad85 (
 code INT,
 _values VARCHAR(25)
);

INSERT INTO mad85 VALUES
(10, 'a,b,c'),
(15, 'd,e,f'),
(20, 'x,y,z');

SELECT
 mad85.code,
 SUBSTRING_INDEX(SUBSTRING_INDEX(mad85._values, ',', harfler.harf), ',', -1) _values
FROM
 (SELECT 1 harf UNION ALL SELECT 2
  UNION ALL SELECT 3 UNION ALL SELECT 4) harfler INNER JOIN mad85
 ON CHAR_LENGTH(mad85._values)-CHAR_LENGTH(REPLACE(mad85._values, ',', '')) >= harfler.harf-1
ORDER BY
 code, harf
Yanıtınız için teşekkür ederim.

SELECT 1 harf UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4

kısmındaki union sayısı value count' a göre değişiyor mu ?

(22-03-2018, Saat: 08:38)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlSorunun çözümüne uygun bir öneri veremeyeceğim ama; verdiğiniz örnekteki tablo, tam olarak Veritabanı Normalizasyon kurallarına aykırı bir tablo. Öncelikle bu tarz yapılardan kurtulmak daha faydalı olacaktır.

Bu Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol'nın incelenmesi faydalı olabilir.

Yanıtınız ve bilgi için teşekkürler. Burada kastettiğiniz tablo ilk tablo ise evet, veri bu şekilde geliyor ne yazık ki. Ben ikinci hale çevirmeye çalışıyorum.

Postgresql ile çok kolay bir şekilde yapabiliyorum. O yüzden orada yaptım çevirme işlemini Smile

SELECT code, trim(UNNEST(string_to_array(values,','))) AS value FROM xyz
Cevapla
#7
SELECT CODE,SPLIT_PARCALANMIS_ITEM FROM TABLO

         CROSS APPLY(SELECT * FROM PRG_SPLIT(TABLO.PARCALANACAK_ALAN,AYRAC)) AS DATA


Denendi ve çalıştı tek yapman gereken split yapıp parçalayarak sana döndüren table function yapman onun linkinide yukarıda verdim
Cevapla
#8
(22-03-2018, Saat: 14:20)narkotik Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
SELECT CODE,SPLIT_PARCALANMIS_ITEM FROM TABLO

         CROSS APPLY(SELECT * FROM PRG_SPLIT(TABLO.PARCALANACAK_ALAN,AYRAC)) AS DATA


Denendi ve çalıştı tek yapman gereken split yapıp parçalayarak sana döndüren table function yapman onun linkinide yukarıda verdim

Hocam bu MySQL için mi? google a sorduğumda ne CROSS APPLY nede PRG_SPLIT için bir iz yok
Cevapla
#9
"CROSS APPLY" SQL Server'da kullanılıyor. PRG_SPLIT ise tablo değerli bir fonksiyon olması yüksek ihtimal.
Cevapla
#10
SQL Server 2016 ve sonrasında bu işler için STRING_SPLIT diye bir fonksiyon tanıtıldı, kullanımı için;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

sayfasından yararlanılabilir. 2016 öncesindeki sürümler için aşağıdaki fonksiyondan faydalanabilirsiniz;

IF OBJECT_ID('str_split') IS NOT NULL  DROP FUNCTION dbo.str_split;
GO

CREATE  FUNCTION dbo.str_split
( @Metin VARCHAR(8000)
, @Ayrac VARCHAR(10)
)
RETURNS @SONUC TABLE
( Eleman VARCHAR(8000) )
AS  BEGIN
   DECLARE @I INT = -1;
   WHILE ( LEN(@Metin) > 0 ) BEGIN 
           SET @I = CHARINDEX(@Ayrac, @Metin);
           IF (@I = 0) AND (LEN(@Metin) > 0) BEGIN  
               INSERT INTO @SONUC VALUES (@Metin);
               BREAK;
           END ELSE
           IF (@I > 1) BEGIN
               INSERT INTO @SONUC VALUES (LEFT(@Metin, @I - 1));
               SET @Metin = RIGHT(@Metin, (LEN(@Metin) - @I));
           END ELSE BEGIN
               SET @Metin = RIGHT(@Metin, (LEN(@Metin) - @I));
           END
   END
   RETURN
END
GO

Kullanımı;
SELECT 10 as ID, Eleman FROM dbo.str_split('a,b,c,ç,d,e,f,g,ğ,h,ı,i,j,k,l,m,n,o,ö,p,q,r,s,ş,t,u,ü,v,w,x,y,z', ',')
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  MySQL SP recover.. mcuyan 6 211 06-01-2018, Saat: 17:07
Son Yorum: mcuyan
Question MySQL ve MsSQL Md5 Fonksiyon Sonuçları Eşleşmiyor frmman 6 255 22-12-2017, Saat: 09:25
Son Yorum: frmman
  MySQL & DLL (User Defined Function) yhackup 11 425 13-12-2017, Saat: 14:09
Son Yorum: yhackup
  MySQL Function Kullanımı yhackup 6 2.260 15-08-2017, Saat: 09:09
Son Yorum: yhackup
  Mysql #23000Duplicate entry hatası masteryoda 8 514 04-08-2017, Saat: 22:35
Son Yorum: masteryoda



Konuyu Okuyanlar: 1 Ziyaretçi