sql qiymatida bo'sh bo'lmagan qiymatlarni aniqlash

Ob'ekt ustuni (null emas) guruhidagi ID ustuniga ega bo'lgan barcha qatorlarni qanday qilib olish mumkin.

Id      Name    Status
1394    Test 1  Y
1394    Test 2  null    
1394    Test 3  null    
1395    Test 4  Y
1395    Test 5  Y

Men tanlashni * jadvalida yozdim, bu erda status = 'Y' . Bu menga 3 ta yozuvni keltiradi, faqat oxirgi 2 ta shartni kiritish shartmi? 1394 ID'da boshqa 2 ta yozuv mavjud, bu holat nolga teng.

1

14 javoblar

Agar siz faqat faqat y bo'lgan guruhlarni tanlashni xohlasangiz, quyidagilarni qilishingiz mumkin:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.id = t.id and
                        (t2.Status <> 'Y' or t2.status is null)
                 );

Faqat idlarni xohlasangiz, guruhini va ega yordamida ishlataman:

select id
from t
group by id
having min(status) = 'Y' and max(status) = 'Y' and count(*) = count(status);

Oxirgi holatda NULL qiymatlari tekshirilmaydi.

Siz shuningdek quyidagilarni yozishingiz mumkin:

having min(status = 'Y' then 1 else 0 end) = 1
3
qo'shib qo'ydi

Agar siz faqat faqat y bo'lgan guruhlarni tanlashni xohlasangiz, quyidagilarni qilishingiz mumkin:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.id = t.id and
                        (t2.Status <> 'Y' or t2.status is null)
                 );

Faqat idlarni xohlasangiz, guruhini va ega yordamida ishlataman:

select id
from t
group by id
having min(status) = 'Y' and max(status) = 'Y' and count(*) = count(status);

Oxirgi holatda NULL qiymatlari tekshirilmaydi.

Siz shuningdek quyidagilarni yozishingiz mumkin:

having min(status = 'Y' then 1 else 0 end) = 1
3
qo'shib qo'ydi

Oddiy usul:

select * from mytable
where status = 'Y'
and id not in (select id from mytable where status is null)
2
qo'shib qo'ydi
@ jason bu tushunishni osonlashtiradi va ma'lumot hajmi katta bo'lmasa, bu juda yaxshi ishlaydi. Ko'pincha optimiser buni birlashuvga aylantiradi, shuning uchun ishlash ko'rsatkichi kodlangan birlashma bilan bir xil bo'lishi mumkin.
qo'shib qo'ydi muallif Bohemian, manba
"Oddiy usul" odatda yaxshi ishlamayotgan bo'lsa, "noto'g'ri" iboralarni qo'llash ... null-statuslar to'plamiga tashqi qo'shilish afzalroq.
qo'shib qo'ydi muallif JasonInVegas, manba

Oddiy usul:

select * from mytable
where status = 'Y'
and id not in (select id from mytable where status is null)
2
qo'shib qo'ydi
@ jason bu tushunishni osonlashtiradi va ma'lumot hajmi katta bo'lmasa, bu juda yaxshi ishlaydi. Ko'pincha optimiser buni birlashuvga aylantiradi, shuning uchun ishlash ko'rsatkichi kodlangan birlashma bilan bir xil bo'lishi mumkin.
qo'shib qo'ydi muallif Bohemian, manba
"Oddiy usul" odatda yaxshi ishlamayotgan bo'lsa, "noto'g'ri" iboralarni qo'llash ... null-statuslar to'plamiga tashqi qo'shilish afzalroq.
qo'shib qo'ydi muallif JasonInVegas, manba

Oddiy usul:

select * from mytable
where status = 'Y'
and id not in (select id from mytable where status is null)
2
qo'shib qo'ydi
@ jason bu tushunishni osonlashtiradi va ma'lumot hajmi katta bo'lmasa, bu juda yaxshi ishlaydi. Ko'pincha optimiser buni birlashuvga aylantiradi, shuning uchun ishlash ko'rsatkichi kodlangan birlashma bilan bir xil bo'lishi mumkin.
qo'shib qo'ydi muallif Bohemian, manba
"Oddiy usul" odatda yaxshi ishlamayotgan bo'lsa, "noto'g'ri" iboralarni qo'llash ... null-statuslar to'plamiga tashqi qo'shilish afzalroq.
qo'shib qo'ydi muallif JasonInVegas, manba

Oddiy usul:

select * from mytable
where status = 'Y'
and id not in (select id from mytable where status is null)
2
qo'shib qo'ydi
@ jason bu tushunishni osonlashtiradi va ma'lumot hajmi katta bo'lmasa, bu juda yaxshi ishlaydi. Ko'pincha optimiser buni birlashuvga aylantiradi, shuning uchun ishlash ko'rsatkichi kodlangan birlashma bilan bir xil bo'lishi mumkin.
qo'shib qo'ydi muallif Bohemian, manba
"Oddiy usul" odatda yaxshi ishlamayotgan bo'lsa, "noto'g'ri" iboralarni qo'llash ... null-statuslar to'plamiga tashqi qo'shilish afzalroq.
qo'shib qo'ydi muallif JasonInVegas, manba

Mana, ba'zi bir echimlarni topish mumkin, chunki siz ishlab chiqargan mahsulotga kerakli narsani aniq bilmayman:

Select Id, Name, Status from table where status is not null;  

3 ta qator natijalar:

 Id      Name    Status
1394    Test 1    Y 
1395    Test 4    Y
1395    Test 5    Y


Select Id, count(*) as anAmt from table where status is not null group by Id;  
    /* only retrieves counts per Id */

har bir Id uchun 1 qatorga kiradi:

Id         anAmt
1394         1
1395         2
0
qo'shib qo'ydi

Mana, ba'zi bir echimlarni topish mumkin, chunki siz ishlab chiqargan mahsulotga kerakli narsani aniq bilmayman:

Select Id, Name, Status from table where status is not null;  

3 ta qator natijalar:

 Id      Name    Status
1394    Test 1    Y 
1395    Test 4    Y
1395    Test 5    Y


Select Id, count(*) as anAmt from table where status is not null group by Id;  
    /* only retrieves counts per Id */

har bir Id uchun 1 qatorga kiradi:

Id         anAmt
1394         1
1395         2
0
qo'shib qo'ydi

Mavjud so'rov "Agar qaerda vaziyat = 'Y' 'sizni aniqlik bilan null holga keltirmaydi.

Agar siz guruhlangan natijalarni olishga urinmoqchi bo'lsangiz, "GROUP BY id" iborasi bunga erishadi, bu esa "*" emas, balki aniq tanlovga id qo'yishni talab qiladi.

Example: SELECT id, COUNT(id) from table where status = 'Y'

0
qo'shib qo'ydi

Mavjud so'rov "Agar qaerda vaziyat = 'Y' 'sizni aniqlik bilan null holga keltirmaydi.

Agar siz guruhlangan natijalarni olishga urinmoqchi bo'lsangiz, "GROUP BY id" iborasi bunga erishadi, bu esa "*" emas, balki aniq tanlovga id qo'yishni talab qiladi.

Example: SELECT id, COUNT(id) from table where status = 'Y'

0
qo'shib qo'ydi

Mavjud so'rov "Agar qaerda vaziyat = 'Y' 'sizni aniqlik bilan null holga keltirmaydi.

Agar siz guruhlangan natijalarni olishga urinmoqchi bo'lsangiz, "GROUP BY id" iborasi bunga erishadi, bu esa "*" emas, balki aniq tanlovga id qo'yishni talab qiladi.

Example: SELECT id, COUNT(id) from table where status = 'Y'

0
qo'shib qo'ydi

Agar men buni to'g'ri o'qiyotgan bo'lsam, hech qachon NULL maqomning qiymatiga ega bo'lmagan guruhlash uchun identifikatorni keltirmoqchisiz:

Mavjud bo'lmagan holda pastki so'rovni ishlataman:

SELECT DISTINCT ID FROM mytable WHERE status IS NULL;

So'ngra u ro'yxatda bo'lmagan identifikatorlarni filtrlash:

SELECT * FROM mytable WHERE id NOT IN (SELECT DISTINCT ID FROM mytable WHERE status IS NULL);
0
qo'shib qo'ydi

Agar men buni to'g'ri o'qiyotgan bo'lsam, hech qachon NULL maqomning qiymatiga ega bo'lmagan guruhlash uchun identifikatorni keltirmoqchisiz:

Mavjud bo'lmagan holda pastki so'rovni ishlataman:

SELECT DISTINCT ID FROM mytable WHERE status IS NULL;

So'ngra u ro'yxatda bo'lmagan identifikatorlarni filtrlash:

SELECT * FROM mytable WHERE id NOT IN (SELECT DISTINCT ID FROM mytable WHERE status IS NULL);
0
qo'shib qo'ydi

Agar men buni to'g'ri o'qiyotgan bo'lsam, hech qachon NULL maqomning qiymatiga ega bo'lmagan guruhlash uchun identifikatorni keltirmoqchisiz:

Mavjud bo'lmagan holda pastki so'rovni ishlataman:

SELECT DISTINCT ID FROM mytable WHERE status IS NULL;

So'ngra u ro'yxatda bo'lmagan identifikatorlarni filtrlash:

SELECT * FROM mytable WHERE id NOT IN (SELECT DISTINCT ID FROM mytable WHERE status IS NULL);
0
qo'shib qo'ydi