folder Tahribat.com Forumları
linefolder Database - Veritabanı
linefolder Sql Select Virgüllü Kayıt



Sql Select Virgüllü Kayıt

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    cemnet
    cemnet's avatar
    Kayıt Tarihi: 18/Eylül/2007
    Erkek

    merhaba şöyle bir tablo var elimizde içersinde sadece 2 olanları getir nasıl deriz?

     

    create table dbo.Cem

    (

    adi varchar(50),

    cat nvarchar(20)

    )

     

    insert Cem(adi,cat)values('google','1,2,3')

    insert Cem(adi,cat)values('yandex','2')

    insert Cem(adi,cat)values('bing','1,3')

    insert Cem(adi,cat)values('altavista','2,3')

    insert Cem(adi,cat)values('giz','22,3,222')

     

    select * from cem where cat in('2') sadece içersinde 2 olan yandex kaydını getiriyor. Like yapıncada 'giz' isimli kayıt ile çakışıyor.

     

  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Elif - Efe
    undefined-01
    undefined-01's avatar
    Kayıt Tarihi: 19/Aralık/2003
    Homo

    en basiti

    insert Cem(adi,cat)values('google','1,2,3')

    insert Cem(adi,cat)values('yandex','2')

    insert Cem(adi,cat)values('bing','1,3')

    insert Cem(adi,cat)values('altavista','2,3')

    insert Cem(adi,cat)values('giz','22,3,222')

    yerine 

    insert Cem(adi,cat)values('google',',1,2,3,')

    insert Cem(adi,cat)values('yandex','2')

    insert Cem(adi,cat)values('bing',',1,3,')

    insert Cem(adi,cat)values('altavista',',2,3,')

    insert Cem(adi,cat)values('giz',',22,3,222,')

    yapmak olacaktir.

     

    simdi like ile '%,2,%' gibi ararsin


    Bu aralar fazla yogunum. Unuttugum seyler oluyorsa affola. DM vs atın.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    cemnet
    cemnet's avatar
    Kayıt Tarihi: 18/Eylül/2007
    Erkek

    evet o şekilde de oluyor ama araya ek kayıt eklemeden nasıl çözülür ona baktım yoksa sorgu esnasında dinamik olarakta virgül eklenebilir

  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Elif - Efe
    undefined-01
    undefined-01's avatar
    Kayıt Tarihi: 19/Aralık/2003
    Homo

    http://www.codeproject.com/Tips/635166/SQL-Column-Values-as-Comma-Separated-String  bir buna bak hocam istersen.


    Bu aralar fazla yogunum. Unuttugum seyler oluyorsa affola. DM vs atın.
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    1-)Böyle kayıtları tutmak için aslında Document tabanlı Nosql veritabanları daha uygun (mongoDB) gibi.

    Tercihini özel sebeplerden dolayı (stability, ACID, vs.) sql destekli bir RDBMS'den yana kullanacaksan eğer;

    2-)Regexp ile SQL 'de aratabilirsin. Hangi sql engine kullanıyorsun bilmiyorum aslında. Her SQL engine regexp ile aramaya destek vermez. MYSQL destek veriyor şu an. Mysql için örnek vereyim :  SELECT 'Baaan' REGEXP '^Ba*n'; gibi.. http://dev.mysql.com/doc/refman/5.1/en/regexp.html

    3-)LIKE gibi bir komutla arayabilirsin (başa sona virgül konularak)

    4-)Her Cem satırının bir PK'sı olduğunu varsayarsak, her CEM tablosunun satırını referans alan bir CATS tablosu oluşturursun ve bu CATS tablosundan, CEM tablosunun Primary Keylerini göstererek categorileri insert edersin. Zaten aslında yapman gereken verimli yol bu. (SQL'in işini programa yaptırtma)

    Ornek Tablo

    CEM( id, name)  CEMtoCAT (id, cemId, catNo)

    DrKill tarafından 14/May/14 12:55 tarihinde düzenlenmiştir

    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Gizem
    sLeymN
    sLeymN's avatar
    Kayıt Tarihi: 31/Mart/2008
    Erkek

    hocam tablo yapın aslında çok yanlış, cat dediğin alan büyük ihtimal ile categori olanı. 

    tablonu 2 ye bölmeni ve ilk tabloda 

    id ve adı yani 1 google 2 yandex gibi

    ikinci tabloda da 

    id ve cat id tutman daha sağlıklı.

     


    Cehennemin dibine kadar yolum var daha.. || Nasılsa her yalnız kendine sürgündür Asmera unutma.
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tarikat Şeyhi
    HolyOne
    HolyOne's avatar
    Kayıt Tarihi: 01/Haziran/2002
    Erkek

    Aynen, tablo yapısı yanlış, çok kayıtta baya sürünecektir ama şöyle yapabilirsn, bu spyi ekle ve örnekteki gibi kullan

    ALTER FUNCTION [dbo].[Split]
        (
          @RowData NVARCHAR(MAX) ,
          @SplitOn NVARCHAR(5)
        )
    RETURNS @ReturnValue TABLE ( Data NVARCHAR(MAX) )
    AS 
        BEGIN
            DECLARE @Counter INT
            SET @Counter = 1 
            WHILE ( CHARINDEX(@SplitOn, @RowData) > 0 ) 
                BEGIN  
                    INSERT  INTO @ReturnValue
                            ( data
                            )
                            SELECT  Data = LTRIM(RTRIM(SUBSTRING(@RowData, 1,
                                                                 CHARINDEX(@SplitOn,
                                                                  @RowData) - 1)))
                    SET @RowData = SUBSTRING(@RowData,
                                             CHARINDEX(@SplitOn, @RowData) + 1,
                                             LEN(@RowData)) 
                    SET @Counter = @Counter + 1  
                END 
            INSERT  INTO @ReturnValue
                    ( data )
                    SELECT  Data = LTRIM(RTRIM(@RowData))  
            RETURN  
        END;
        
    GO
    
    ----------------------
    DECLARE @str VARCHAR(MAX)
    SET @str = '11111,22222,33333'
    SELECT  *
    FROM    dbo.Split(@str, ',')
    HolyOne tarafından 14/May/14 15:08 tarihinde düzenlenmiştir

    Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı kötektir!
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    cemnet
    cemnet's avatar
    Kayıt Tarihi: 18/Eylül/2007
    Erkek

    2 tablo olmasın istedim aslında çok kayıt olduğunda inner Join'ler, group by max'lar devreye girecek yoksa, gerçi bu defada LIKE operatörünü kullanıyorum yağmurdan kaçıp doluya tutulmak gibi.

    DrKill 

    mssql kullanıyorum sanırım REGEXP komutu burada yok. 2 farklı tabloda bitir diyorsun sanırım üstteki açıklamam yüzünden öyle yapmadım.

    sLeymN

    normalde bu işleri dediğin gibi yapardım bir çok kişi gibi bu defa farklılık olsun istedim performans olarak fazladan inner Joinler olmasın diye.

    HolyOne

    şeyh senin verdiğin kategori id değerlerini ikinci tabloda tutan insanlar için tek sorguda '2,4,5' şeklinde çıktı alabilmek için yapılan bir fonksyon benim işlemin bir öncesinde yapılan işlem yani. teşekkürler yinede.

     

    işlemi virgül koyarak LIKE operatoru ile halletttim ikinci bir tablodan kaçmak adına. Ek bir sutun açarak çözdüm ama performans açısından test etmedim bir milyon kayıt üzerinde deneme yapmak lazım aslında böyle gelişi güzel doğru değil :) 

  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    pSkpt
    pSkpt's avatar
    Kayıt Tarihi: 10/Aralık/2010
    Erkek

    "B.genre_id REGEXP '(^".$value.",|,".$value.",|,".$value."$)'";

    ben bu şekilde kontrol ettirmiştim. genre_id içersinde

    2,5,8

    12,15,85

    22,68,85

    gibi kayıtlar olsun kontrolü şöyle yapıyor örnek 2 için diyorum

    2, => var mı?

    ,2, => var mı?

    ,2 => var mı?


    İmza...
Toplam Hit: 1169 Toplam Mesaj: 9