İki sütunun minimum değerine göre sırala

SQL Server 2008 R2 kullanıyorum.

Bir tabloyu iki sütunun minimum değerine göre sıralamam gerekiyor.

Masa şöyle gözüküyor:

ID: integer; 
Date1: datetime; 
Date2: datetime.

Verilerimin en az iki tarihle sıralanmasını istiyorum.

Bu masayı bu şekilde sıralamanın en basit yolu nedir?

50
SQL Server'ın skalar bir MIN işlevi olmaması utanç verici. Lütfen oy verin: bağlanın .microsoft.com/SQL/geri bildirim/ayrıntılarını/767183/& hellip;
katma yazar usr, kaynak
Gerçekten emin değilim, 'en az iki tarihle sıralanmış' ile ne demek istiyorsunuz? Bize 3 satırdan fazla bir örnek veri verebilir misiniz?
katma yazar PeterRing, kaynak
@Infinity - İki ödül? Bu biraz sıradan soru garantilerinin ne kadar "dikkatini" hissediyorsunuz?
katma yazar Martin Smith, kaynak
@ usr: Muhtemelen, ancak bu durum için çalışmayabilir. Bana göre, eğer böyle bir işlev varsa, MIN toplamına benzer şekilde çalışacağını, yani tüm argümanlar NULL olmadıkça (ya da argüman olmadıkça) NULL'ları görmezden geleceğini beklemek makul görünüyor. ORDER BY, diğer taraftan, herhangi bir veri türü için bir NULL değerini en küçük değer olarak kabul eder. OP sıralama sonuçlarını kullanmak istediğinden, NULL'a MIN ile nasıl davranıldığından ziyade, ORDER BY tarafından tedavi edildiği şekilde muamele etmekle ilgilenebilirler.
katma yazar Andriy M, kaynak
connect web sitesi böyle bir çöp ... oraya gitmek için oraya gidiyorsunuz ve hiçbir şey yapmıyor. Olmazsa, size bir hata oluştuğunu söylemez, oturum açmanız gerekip gerekmediğini bile söylemez, sadece ekranın bir tür yüklediği ancak hiçbir şey alamadığınız bir tür güncelleme paneli/ajax isteği kullanır. o. Günlük hatalarını ya da özellik isteklerini bile unutmamak bile zor. Ve bu arada, aklı başında kim bir özellik isteğini kapatıyor, çünkü “şimdi ilgilenmemiz gereken öncelikli şeyler var” ... tamam ... ama bu talebe olandan daha fazlası!?!?! MS = Yavaş yavaş dağılıyor
katma yazar JonH, kaynak
Asgari sütunların nasıl elde edileceği ile ilgili bir soruda soru cevapların birçoğu ile ilgilenebilirsiniz. İşte iki örnek: stackoverflow.com/questions/1947753/… dba.stackexchange.com/questions/21542/…
katma yazar user38858, kaynak

13 cevap

NOT NULL columns. You need to add CASE statement into ORDER BY clause in following:

SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE 
           WHEN Date1 < Date2 THEN Date1 
           ELSE Date2 
         END 

NULLABLE columns. As Zohar Peled wrote in comments if columns are nullable you could use ISNULL (but better to use COALESCE instead of ISNULL, because It's ANSI SQL standard) in following:

SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE 
           WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1 
           ELSE Date2 
         END

ANSI standart tarih biçimini 1753-01-01 burada .

57
katma
Bu, tarih sütunlarının null olmadığı varsayılmaktadır. eğer öyleyse, o zaman doğru cümle, ISNULL OLDUĞUNDAN KAZANÇ (Tarih1, '01/01/1753 ')
katma yazar Zohar Peled, kaynak
Katılıyorum, ancak OP bu konunun farkında olmayabilir, bu yüzden söylemeye değer. Yine de oyumu aldınız, çünkü cevabınız MSDN’nin ilgili kısımlarına bağlantılar içeriyor ve bunun için diğer cevaba göre daha iyi.
katma yazar Zohar Peled, kaynak
Şimdi keşke bu cevabı iki kere oylayabilsem :-)
katma yazar Zohar Peled, kaynak
Gerçekten ANSI standart tarih biçimini kullanmalısınız. 1753/01/01
katma yazar Sean Lange, kaynak
Geri almalarla durur musunuz lütfen? Bu, art arda cevabınızı "çarpıyor" ve düzenleme işlevinin kötüye kullanılması olarak görülebilir. Aynı zamanda bayrak üretiyor. Bu devam ederse, cevabı kilitlemem gerekecek.
katma yazar Brad Larson, kaynak
Neden cevabını 100 kere düzenliyorsun? Alan silme, alan silme
katma yazar Giorgi Nakeuri, kaynak
Bağlantılı soru, tarih biçimiyle ilgili değil , tarihiyle (01 Ocak 1753 tarihi) ilgili.
katma yazar Andriy M, kaynak
Tabii, ancak OP en basit yolu istedi ve null özellikli sütunlar hakkında farketmedi, bu durumda bu en basit yol.
katma yazar Stanislovas Kalašnikovas, kaynak
Çünkü varsayılan minimum tarihsaat değeri 1753-01-01
katma yazar Stanislovas Kalašnikovas, kaynak
Bunun için eğer date1 boşsa, COALESCE kullanılır. 01/01/1753 değerini alır.
katma yazar Stanislovas Kalašnikovas, kaynak
@qazifarhan yanılıyorsunuz, SİPARİŞ1, TARİH1, tarih2 kullanıyorsanız, önce tarih 1'e göre sıralar ve tarih1'in 2 veya daha fazla değeri aynı tarihe sahipse tarih 2'ye göre sıralanır. Bu soru hakkında: en az 2 sütuna göre nasıl sipariş edilir. Hangisinin alt tarih1 veya tarih2 olduğunu kontrol etmeli ve ardından sıraya koymalıdır.
katma yazar Stanislovas Kalašnikovas, kaynak
Sadece düzenleme geri alma işlevi sınandı. Özel birşey yok.
katma yazar Stanislovas Kalašnikovas, kaynak
Vaka kullanımı, tarih 1'e göre basit sipariş denemek gibi bir etkisi yoktur, tarih2 aynı sonucu verecektir. Bu bir çözüm değil.
katma yazar Ammad, kaynak
@ StanislovasKalašnikovas Çözümünüzü COALESCE kullanmanıza rağmen çıktıyı bozuyor.
katma yazar dyatchenko, kaynak
Korkarım, ancak bu kod Tarih1 NULL ve Tarih2 olmama durumundaki boş sütunlar için işe yaramaz. NULL 'e denk geldiğinde en az tarih olarak Tarih1 alırsınız, ancak gerçekte doğru değildir - satırdaki en küçük tarih Tarih2 , çünkü başka bir sütun datetime değerini içermiyor.
katma yazar dyatchenko, kaynak
@ StanislovasKalašnikovas Hayır, tam olarak ne demek istediğinizi kastettim. Neden 01/01/1753 alıyorsunuz? Neden maksimum datetime değerini kullanmıyorsunuz? Ve neden NULL değerini tarih saat değeri olarak kullanıyorsunuz? 01/01/1753 altında bir tarih kullanırsak ne olur?
katma yazar dyatchenko, kaynak

ORDER BY öğesinde bir CASE kullanın:

 ORDER BY case when date1 < date2 then date1 else date2 end
31
katma
@ qazifarhan, korkarım ki burada yanılıyorsunuz. Basit test: 3 satırlı tablo: 2015-01-10, 2015-01-20 ; 2015-01-20, 2015-01-11 ; 2015-01-15, 2015-01-15 . Bu, iki tarihin MIN sırasına göre sıraladığınızda alacağınız emirdir. Sadece date1, date2 ile sipariş verirseniz, farklı sonuç alırsınız.
katma yazar Vladimir Baranov, kaynak
Tablo sırasına göre tarih1, tarih2 arasından seçim yapın * (% 100 aynı sonuç)
katma yazar Ammad, kaynak
Vaka kullanımı, tarih 1'e göre basit sipariş denemek gibi bir etkisi yoktur, tarih2 aynı sonucu verecektir.
katma yazar Ammad, kaynak

En basit yol, VALUES anahtar kelime, aşağıdaki gibi:

SELECT ID, Date1, Date2
FROM YourTable
ORDER BY (SELECT MIN(v) FROM (VALUES (Date1), (Date2)) AS value(v))

Bu kod, gizlenebilir sütunlarla bile tüm durumlar için çalışacaktır.

Düzenle:

The solution with the COALESCE keyword is not universal. It has the important restrictions:

  • Sütunlar Tarih türünde ise işe yaramaz ( 01/01/1753 tarihinden önceki tarihleri ​​kullanıyorsanız)
  • Sütunlardan birinin NULL olması durumunda çalışmaz. O yorumlar NULL en az datetime değeri olarak değer. Ama aslında doğru? tarihsaat bile değil, hiçbir şey değil.
  • İkiden fazla sütun kullanırsak IF ifadesi daha karmaşık olacaktır.

Soruya göre:

Bu tabloyu bu şekilde sıralamanın en basit yolu nedir?

En kısa ve en basit çözüm, yukarıda açıklanan çözümdür, çünkü:

  • Uygulaması çok fazla kodlamaya ihtiyaç duymaz - sadece bir satır daha ekleyin.
  • Sütunların null olup olmadığına ilişkin olarak umursamanız gerekmiyor . Siz sadece kodu kullanın ve çalışır.
  • Sorgunuzdaki sütun sayısını, yalnızca virgül sonrasını ekleyerek genişletebilirsiniz.
  • Tarih sütunlarıyla çalışır . ve kodu değiştirmeniz gerekmez.

2 Düzenle:

Zohar Peled suggested the following way of order:

Satırları bu kurallara göre sıralardım: ilk olarak, her ikisi de boş olduğunda, ikinci, tarih1 boş olduğunda, üçüncü, tarih 2 boş olduğunda, dördüncü, min (tarih1, tarih2)

Dolayısıyla, bu durumda, aşağıdaki gibi, aynı yaklaşım kullanılarak çözüme ulaşılabilir:

SELECT ID, Date1, Date2
FROM YourTable
ORDER BY 
CASE WHEN Date1 IS NULL AND Date2 IS NULL THEN 0
     WHEN Date1 IS NULL THEN 1
     WHEN Date2 IS NULL THEN 2
     ELSE 3 END,
(SELECT MIN(v) FROM (VALUES ([Date1]), ([Date2])) AS value(v))

Bu kodun çıktısı aşağıdadır:

The output result for *Zohar's* way of order

COALESCE çözüm tabloyu bu şekilde sıralamayacak . Bu karışır , NULL değerinin en az bir hücresinin bulunduğu satırları. Bunun çıkışı şudur:

Weird ORDER BY of <code>COALESCE</code> solution

Umarım bu yardımcı olur ve eleştirmenleri bekler.

8
katma
Bu, boş sütunlarla beklendiği gibi çalışmayacak. Bunun nedeni, MIN toplama işlevinin boş değerleri yok saymasıdır. sqlFiddle şu anda kapalı, bu yüzden size canlı bir örnek gösteremiyorum, ancak sql bu bağlantıdan alabilirsiniz > ve çalıştırmayı deneyin.
katma yazar Zohar Peled, kaynak
Sanırım soruyu fazla karıştırdın. buradaki cevabımı görün. Yine de, OP en verimli ve en ölçeklenebilir değil en basit yolu istedi. Hala bir vakanın bunu yapmanın en basit yolu olduğunu düşünüyorum.
katma yazar Zohar Peled, kaynak
Evet, yine de Stanislovas'ın cevabı, benim değil ... Bu soruya sadece kişisel görüşüm nedeniyle başka bir cevap göndermek için önemli bir neden görmüyorum. yazdığınız ve kabul ettiğim gibi: bu çok işe özgü, bu yüzden kişisel görüşüm OP’nin beklentilerine uygun olmayabilir.
katma yazar Zohar Peled, kaynak
Satırları tess kurallarına göre sıralardım: birincisi, her ikisi de boş olduğunda, ikinci, tarih1 boş olduğunda, üçüncü, tarih 2 boş olduğunda, dördüncü, dak (tarih1, tarih2). Ama işe özel olduğuna katılıyorum. herkes için orjinal sorudaki sütunların null bile edilemeyebileceğini biliyoruz, ve bu delik tartışması OP için anlamsız olsa da, en genel çözümden bahsedeceğim ve Stanislovas'ın cevabının null sütunları için daha iyi bir çözüm sunduğunu düşünüyorum.
katma yazar Zohar Peled, kaynak
Bunu neden düşündüğümü zaten açıkladım: Bu, ORDER BY deyiminin varsayılan davranışıdır.
katma yazar Zohar Peled, kaynak
Yanlış değil, ancak her iki tarihi de içeren bir satırın ardından boş bir tarihi olan satırları yerleştirmek yanlış. Kodu çalıştırdığımda bu sonucu aldım. Gördüğünüz gibi, boş tarihler açıkça ait olmadıkları 5. ve son satırlarda.
katma yazar Zohar Peled, kaynak
Bence, varsayılan olarak, ORDER BY deyiminin boş değerleri göz ardı ettiği değil nedeniyle yanlış. Boşaltılan bir sütuna göre artan bir sıralama yaparsanız, boş değerler sonuç kümesinin üstünde olur. Aksi belirtilmedikçe, çözüm bu davranışı taklit etmek için ilham vermelidir. İlk etapta null sütunları hakkında yorum yapmamın nedeni bu.
katma yazar Zohar Peled, kaynak
@ZoharPeled Katılmıyorum, görev bir satırdaki minimum değere göre sıralamaktır , yani bir satırda yalnızca bir değere sahip olursak minimum . Neden NULL ve datetime arasında minimum değerin NULL olduğunu düşünüyorsunuz?
katma yazar dyatchenko, kaynak
@ZoharPeled Haklısın, daha verimli yaptım.
katma yazar dyatchenko, kaynak
@ ZoharPeled Senin davan için özel bir çözüm yazdım. Kontrol et.
katma yazar dyatchenko, kaynak
@ZoharPeled Tamam, ancak COALESCE cevabı yine de kaotik düzende yapar. Sadece kontrol et. Date1 NULL olduğunda durum daima TRUE olur - Tarih1 değerini alarak ( NULL ). Date2 NULL olduğunda durum daima FALSE olur - Date2 değerini alarak ( NULL ). Her durumda, NULL değerini alıyoruz.
katma yazar dyatchenko, kaynak
@ZoharPeled Evet, elbette yok sayar, ancak yanlış mı?
katma yazar dyatchenko, kaynak
@ ZoharPeled Ben bu oldukça işe özgü bir soru olduğunu düşünüyorum. Ancak IMHO, başında bir satırın NULL olduğu kaotik düzende satırları görmek garip.
katma yazar dyatchenko, kaynak
@ZoharPeled Tamam, neden her ikisinin de sütunlarının NULL olduğu satırları yerleştirmek yanlış? Bir satırın doğru değeri olan en az bir sütunu varsa, bu değer ORDER BY yan tümcesinde kullanılır.
katma yazar dyatchenko, kaynak

If you don't want to use Case statement in the Order By , then this is another approach, just moving the Case statement to Select

SELECT Id, Date1, Date2 FROM 
 (SELECT Id, Date1, Date2
  ,CASE WHEN Date1 < Date2 THEN Date1 ELSE Date2 END as MinDate 
FROM YourTable) as T
ORDER BY MinDate
5
katma

Bu, CASE WHEN gibi dallanma gerektirmeyen alternatif bir çözüm olabilir. Bu, max (a, b) = 1/2 (a + b + | a − b |) formülüne dayanarak DATEDIFF öğesini kullanarak (ve '1773-01-01' ) a ve b'nin mutlak değerlerini alırız.

ORDER BY (DATEDIFF(d,'17730101' ,isnull(Startdate,enddate)) + DATEDIFF(d,'17730101' ,isnull(EndDate,Startdate)) 
    -  ABS(DATEDIFF(d,isnull(Startdate,enddate),isnull(EndDate,Startdate))))

Test Verileri

Create Table #DateData(ID int Identity, Name varchar(15),Startdate datetime,EndDate DateTime)
Insert Into #DateData(Name,Startdate,EndDate) values ('myName','2015-04-17 18:48:27','2015-04-18 18:48:27')
Insert Into #DateData(Name,Startdate,EndDate) values ('myName','2015-04-19 18:48:27','2015-04-18 18:48:27')
Insert Into #DateData(Name,Startdate,EndDate) values ('myName','2015-04-20 18:48:27','2015-04-18 18:48:27')
Insert Into #DateData(Name,Startdate,EndDate) values ('myName','2015-04-11 18:48:27','2015-04-22 18:48:27')
Insert Into #DateData(Name,Startdate,EndDate) values ('myName','2015-05-09 18:48:27','2015-04-18 18:48:27')
Insert Into #DateData(Name,Startdate,EndDate) values ('myName','2015-04-17 19:07:38','2015-04-17 18:55:38')
Insert Into #DateData(Name,Startdate,EndDate) values ('myName','2015-04-17 19:07:38','2015-05-12 18:56:29')

Sorguyu Tamamla

select *
from #DateData order by (DATEDIFF(d,'17730101' ,isnull(Startdate,enddate)) + DATEDIFF(d,'17730101' ,isnull(EndDate,Startdate)) 
-  ABS(DATEDIFF(d,isnull(Startdate,enddate),isnull(EndDate,Startdate))))

5
katma

NULL olabilecek sütunları işlemek için bu yolu tercih ederim:

SELECT Id, Date1, Date2
FROM YourTable
ORDER BY 
   CASE 
     WHEN Date1 < Date2 OR Date1 IS NULL THEN Date1 
     ELSE Date2 
   END 
4
katma

Maks. Kod

CROSS APPLY kullanıyorum, performanstan emin değilim, ancak CROSS APPLY genellikle tecrübelerime göre daha iyi bir performansa sahip.

CREATE TABLE #Test (ID INT, Date1 DATETIME, Date2 DATETIME)
INSERT INTO #Test SELECT 1, NULL, '1/1/1';INSERT INTO #Test SELECT 2, NULL, NULL;INSERT INTO #Test SELECT 3, '2/2/2', '3/3/1';INSERT INTO #Test SELECT 4, '3/3/3', '11/1/1'

SELECT t.ID, Date1, Date2, MinDate
FROM #TEST t
    CROSS APPLY (SELECT MIN(d) MinDate FROM (VALUES (Date1), (Date2)) AS a(d)) md
ORDER BY MinDate

DROP TABLE #Test
4
katma

Her iki date1 ve date2 alanlarını sıralamak istediğinizde, ikisinin de ORDER BY bölümünde olması gerekir. :

SELECT *
FROM aTable
ORDER BY 
    CASE WHEN date1 < date2 THEN date1 
    ELSE date2 END, 
    CASE WHEN date1 < date2 THEN date2 
    ELSE date1 END

Sonuç şöyle olabilir:

date1      | date2      
-----------+------------
2015-04-25 | 2015-04-21
2015-04-26 | 2015-04-21
2015-04-25 | 2015-04-22
2015-04-22 | 2015-04-26

Null değerleriyle kaymakam bir sonuç elde etmek için şunu kullanın:

SELECT *
FROM aTable
ORDER BY 
    CASE 
        WHEN date1 IS NULL THEN NULL
        WHEN date1 < date2 THEN date1 
    ELSE date2 END 
    ,CASE 
        WHEN date2 IS NULL THEN date1
        WHEN date1 IS NULL THEN date2
        WHEN date1 < date2 THEN date2 
    ELSE date1 END

Sonuçlar şöyle olacak:

date1      | date2      
-----------+------------
NULL       | NULL
NULL       | 2015-04-22
2015-04-26 | NULL
2015-04-25 | 2015-04-21
2015-04-26 | 2015-04-21
2015-04-25 | 2015-04-22
2
katma

Odaklamayı nasıl 'dan, neden ' e, buna ihtiyaç duyduğuna ve şemasını değiştirmeyi teklif ettim. Temel kural şudur: verilerinize erişmek için stunts çekmeniz gerekirse, kötü bir tasarım kararı vardır.

Gördüğünüz gibi, bu görev SQL için çok sıradışı, bu yüzden mümkün olsa da, önerilen tüm yöntemler sıradan bir ORDER BY ile karşılaştırıldığında acı bir şekilde yavaşlar.

  • If you need to do this often then the minimum of the two dates must have some independent physical meaning for your application.
    • Which justifies a separate column (or maybe a column replacing one of the two) - maintained by a trigger or even manually if the meaning is independent enough for the column to possibly be neither in some cases.
2
katma

Satırları bu kurallara göre sıralardım:

  1. ikisi de boş olduğunda
  2. tarih1 boş olduğunda
  3. 2. tarih boş olduğunda
  4. dk (tarih1, tarih2)

Bunu yapmak için iç içe geçmiş bir dava basit ve etkili olacaktır (tablo çok büyük olmadıkça) .

SELECT ID, Date1, Date2
FROM YourTable
ORDER BY 
CASE 
  WHEN Date1 IS NULL AND Date2 IS NULL THEN 0
  WHEN Date1 IS NULL THEN 1
  WHEN Date2 IS NULL THEN 2
  ELSE 3 END,
CASE 
  WHEN Date1 < Date2 THEN Date1
  ELSE Date2
END
1
katma
:-) yardım etmekten mutluluk
katma yazar Zohar Peled, kaynak
önemli değil. OP özellikle "Verilerimin en az iki tarihe göre sıralanmasını istiyorum." yazdı. tüm bunlar boş değerleri boş olmayan değerlerden daha küçük olarak kabul etmeniz gerekip gerekmediğine bağlı olarak azalır.
katma yazar Zohar Peled, kaynak
Bu harika görünüyor. Her iki sütun da listenin en üstünde null değerinde bulunur, sütun1 bundan hemen sonra boş, sondan sonra sütun3 değerinde boşalır ve son olarak, sütun1 ve sütun 3 değerlerinin minim değeri (resminize bir nedenle dahil değildir) Sadece bunun için gidiyordum, burada bir problem görmüyorum.
katma yazar Zohar Peled, kaynak
@dyatchenko Gerçekten ne istediğini bilmiyorum. Sorguların her ikisi de sql sunucusunda 2012 iyi çalışıyor , diğer sürümlerde bunları test etmenin bir yolu yok ama bence orada da iyi olmalılar. Bu arada, çoğu seçmen davaların bu soruna en basit çözüm olarak sırayla geldiğini düşünüyor ve ben de onlardan biri oluyorum.
katma yazar Zohar Peled, kaynak
Benim için işe yaradı, ancak herhangi bir sql sunucu sürümü için bir sorun olmayacak şekilde cevabımı güncelledim.
katma yazar Zohar Peled, kaynak
Tamam. Yine de teşekkürler!
katma yazar dyatchenko, kaynak
Sanırım bu görev için sizin ve benim yaklaşımımın karışımı aslında doğru cevap. Katılımınız için teşekkür ederiz! Bunu düşünerek aklımı kırdım :)
katma yazar dyatchenko, kaynak
Fakat ilk sütundaki tarihlerin sırası? 2023-04-01 -> 2011-04-01 -> 1750-02-01 . İşte tam tersi olmalı. Bunun gibi: gyazo.com/c8ef6007a8800b70f8dfbd9e776b3608
katma yazar dyatchenko, kaynak
İşte kanıtı: gyazo.com/385ea999676eedee155f9eaa05334899 . Boş Tarih2 ile daha fazla değer eklemeye çalışın.
katma yazar dyatchenko, kaynak
ORDER BY içerisindeki durumlar, soru için en basit çözüm değildir.
katma yazar dyatchenko, kaynak
Yine de çalışmıyor. Tarih1> Tarih2 , birinin NULL olması durumunda her zaman yanlıştır.
katma yazar dyatchenko, kaynak
Çalışmıyor Operand type clash: int tarihle uyumlu değil
katma yazar dyatchenko, kaynak

Başka bir seçenek var. Sonuç sütununu gerekli mantığa göre hesaplayabilir ve seçiminizi harici bir sütuna göre sıralayabilirsiniz. Bu durumda kod aşağıdaki gibi olacaktır:

select ID, x.Date1, x.Date2
from
(
    select
        ID,
        Date1,
        Date2, 
        SortColumn = case when Date1 < Date2 then Date1 else Date2 end
    from YourTable
) x
order by x.SortColumn

Bu çözümün avantajı, gerekli filtreleme sorgularını ekleyebilmenizdir (iç seçimde) ve yine de dizinler faydalı olacaktır.

1
katma
SELECT ID, Date1, Date2
FROM YourTable
ORDER BY (SELECT TOP(1) v FROM (VALUES (Date1), (Date2)) AS value(v) ORDER BY v)

@Dyatchenko cevabına çok benzer, ancak NULL sorunu yoktur

0
katma

min işlevini sırayla yan tümcesinde kullanabilirsiniz:

select * 
from [table] d
order by ( select min(q.t) from (
           select d.date1 t union select d.date2) q
         )

You can also use case statement in order by clause but as you know the result of comparing (> and <) any value (null or none null) with null is not true even if you have setted ansi_nulls to off. so for guaranteeing the sort you wanted, you need to handle nulls, as you know in case clause if the result of a when is true then further when statements are not evaluated so you can say:

select * from [table]
order by case 
           when date1 is null then date2
           when date2 is null then date1 
           when date1

Ayrıca, senaryonuzun farklı olması durumunda belki başka çözümler de olabilir, belki de ayrılmış bir alan içindeki birden çok sütunun (veya bir hesaplamanın) karşılaştırmasının sonucunu değerlendiriyorsunuz ve son olarak da, sıranız içinde herhangi bir koşul kullanmadan, bu hesaplanan alana göre sıralıyorsunuz.

0
katma