Sql Select Virgüllü Kayıt
-
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.
-
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
-
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
-
http://www.codeproject.com/Tips/635166/SQL-Column-Values-as-Comma-Separated-String bir buna bak hocam istersen.
-
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 -
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ı.
-
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 -
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.
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.
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.
ş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 :)
-
"B.genre_id REGEXP '(^".$value.",|,".$value.",|,".$value."$)'";
ben bu şekilde kontrol ettirmiştim. genre_id içersinde2,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ı?
