2009-09-21 19 views
37

Bir CASE ifadesiyle MySQL'de saklı yordam kullanıyorum.Boş bir sonuç kümesi nasıl seçilir?

CASE'in ELSE deyiminde (varsayılan değere eşdeğerdir) boş bir sonuç kümesini seçmek ve döndürmek, böylece ELSE örneğini kullanmamakla bir SQL hatası atmaktan kaçınmak ve bunun yerine boş bir sonuç kümesi olarak döndürmek Düzenli bir sorgu, hiçbir satır döndürmezdi.

Şimdiye kadar böyle bir şey kullanarak bunu başardınız:
Select NULL From users Where False

Ama 'users' bu örnekte olduğu gibi, varolan bir tabloyu, isim vermek zorunda. Çalışıyor, ancak en sonunda kullanılan tablo adı yeniden adlandırılır veya bırakılırsa kırılmayacak daha zarif bir yol tercih ederim.

Ben Select NULL Where False denedim ama çalışmıyor. BOŞ adlı bir sütun ile ve bir NULL değeri ile

boş kümesi dönmez Select NULL kullanma

, ama bir satır.

+0

Gerçekten varlığını garanti edebileceğiniz tek bir masa olmayan garip bir şema olurdu! – onedaywhen

+0

Haklısınız. Var olan bir sürü tablo var, sorun şu ki, bir tablo seçtikten sonra, eğer bu tabloya bırakılırsa ya da yeniden adlandırılırsa, yazdığınız kod artık işe yaramaz ve hiçbir şey olmayan yazılımın iki parçasını birleştirirsiniz Birbirleriyle bir arada olmak, bir tanesinde bir değişiklik, diğerinin çalışmayı durdurmasını sağlar.Buna kuplaj denir ve yazılımdaki bağlantı genellikle kötü bir fikirdir. – Petruza

+1

@Petruza: Access/Jet'i kullandığım günlerde şemamda bu amaç için 'RowRowTable' adında kalıcı bir yardımcı tablo yer alacaktır. – onedaywhen

cevap

37

Kullanmak gerekir 'ikili' olarak adlandırılan MySQL bir kukla-masa var.

select 
    1 
from 
    dual 
where 
    false 

Bu her zaman boş bir sonuç verecektir.

+0

Evet. 'dual' bu amaç için doğar. – Rockallite

+0

Ne yazık ki, bu çözüm MySQL'in IN alt sorgularında 5.7'nin altında çalışmıyor. '(NEREDEN YANLIŞ ikili GELEN 1 SEÇ) 'de 1'i seçin;' @dhruvbird önerdiği 1. Yalnızca çözüm Böyle bir şey denedim benim – ENargit

2

Bu nasıl? yaklaşık

SELECT * FROM (SELECT 1) AS TBL WHERE 2=3 

myphp teslim ve aynı zamanda sqlite ve muhtemelen başka db motorda nasıl çalışır

SELECT 'MyName' AS EmptyColumn 
FROM dual 
WHERE 'Me' = 'Funny' 
+0

çalıştı döndürür, ancak olmadan itibaren en az MySQL yasal olmadığı yerlerde kullanıyorum sanırım dunno ANSI SQL. – Petruza

+0

Bu, MySQL 5.5'te sözdizimi hatasına neden oluyor. – Rockallite

3

Bu, muhtemelen tüm veritabanlarında çalışacaktır.

SELECT * FROM (SELECT NULL AS col0) AS inner0 WHERE col0 IS NOT NULL; 
1
SELECT * FROM (SELECT NULL) WHERE 0 
+3

Sorunu çözen bir kod sağladığında, aynı zamanda, okumaya devam etmenin en azından kısa bir açıklamasını vermek de önemlidir; böylece, okumaya devam eden insanlar, farklılıkların anlaşılması için okumaya zihinsel olarak ayrıştırmak zorunda kalmazlar. – Fluffeh

+5

mysql versiyonumda takma ad eklemek zorunda kaldım: SELECT * FROM (SELECT NULL) bir WHERE 0; – shark555

15

Bu en çalışması gerekir veritabanları Postgrees ve Netezza'nın test:

SELECT NULL LIMIT 0; 
+4

Bu çözümü en çok beğendim. MySQL'de de çalışır (v5.5). – noodl

+1

Hayır, bu MySQL'de bir alt sorguda çalışmıyor. Hata yaratın 'MySQL'in bu sürümü 'LIMIT & IN/ALL/ANY/SOME alt sorgusunu' (v5.5) desteklemiyor. Yani bu cevap bu soru için uygun değil. – Rockallite

+1

LIMIT standart değil, bu yüzden 'herhangi bir DB' üzerinde çalışamaz. Örneğin MSSQL veya DB2'yi deneyin. –

3
SELECT TOP 0 * FROM [dbo].[TableName] 

Bu bir Sabit tarama operatörüne makul yaklaşım. PostgreSQL de

+0

varolan tablo adı belirtmek gerek kalmadan bir sorgu için sorulan OP, demek bu cevabı güncellemek mı. – Marki555

0

basit

SELECT; 

çalışır. 'Bilinmeyen' etiketli sütunları bile almazsınız.
Ancak, yine de 1 satır alındığını söylüyor.

+0

Teknik olarak boş bir sonuç değil, öyle değil mi? 'Sahte'yi seç' nasıl? –

+0

0 satır yerine, bu 0 sütunu döndürür. – luckydonald

İlgili konular