2016-03-31 15 views
0

In this question Mysql'in iki argüman alan bir işlevi olup olmadığını ve null ilkini null veya aksi takdirde ikinci argümanı döndürdüğünü sordum. Birisi yorum bölümünde böyle bir fonksiyonun bulunmadığını söyledi. Herhangi bir türden argüman alabileceğini ve dönüş değerinin null veya ikinci parametrenin aynı türünde olabileceğini düşünerek Mysql'deki bu işlevi nasıl tanımlayabilirim? Bu mümkün mü?Mysql - null olmayan değerlerin dönüştürülmesi bölüm 2

+0

'seçeneğini durumda ARG1 Sonu' –

+0

basit yöntemi arg2 sonra boş başka boş (ARG1 ucu arg2 sonra boş değil durumda) '' dır. İstediğiniz bir işlev, Oracle'dan nvl2() 'dir. –

+1

MySQL, sizi doğru anladığım takdirde bunun için çalışacak olan [COALESCE] özelliğini (http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_coalesce) desteklemektedir. –

cevap

0

Bu sizin veya gereksinimlerinize göre mümkün değil.

Kayıtlı işlevlerin (SQL ile yazılmış) ve kullanıcı tanımlı işlevlerin (C dilinde yazılmış) argümanları ve dönüş değerleri statik olarak yazılmıştır.

Verilen, MySQL örtülü döküm ile oldukça esnektir, ancak değerler yine de yazılmıştır. Örtük döküm ile tamam olsanız bile, görünüşte açık olan çözümün tercih edilebileceği bir senaryo hayal etmek zordur.

IF(foo IS NULL,foo,bar) amaçla yeterli ve doğru olarak yatan türlerini korumak ve foo tipi kaybedilecek olsa IF(foo IS NULL,NULL,bar), hemen hemen aynı şey olurdu olurdu (örneğin bir "Nasıl Bir BOŞ DATETIME var"). Sezgisel olarak açık olmayan nedenlerden dolayı bunları daha önce reddettiniz. Bir amaç, yerleşiklerle başarılabildiğinde, tekerleği yeniden icat etme motivasyonunun anlaşılması zordur.

+0

İstediğim şey değil, yalnızca iki argüman alan bir işlev yapmak istiyorum ve sadece bu "if" işleviyle kullanılmam gerektiğini açıklıyorsunuz çünkü amacımı gerçekleştiremiyorum. Bunu yapmak istediğim nedeni oldukça basittir, şu durumda var: 'eğer (isNull (sale.id), null, 'bir satışla ilgili'), eğer (isNull (purchace.id), null, 'bir satın alma ile ilgili') ...), çünkü bu sorunun kapsamı dışında kalan bir nedenden ötürü bir ödeme bağlamı elde etmek için sol birleşme yapıyorum. – FtheBuilder

+0

* Facepalm. * Neden böyle söylemediniz? Çözümünüz basit: 'sale.id SATIŞ SONRA NULL '' NEDEN SONRA NEDEN '' satın almayla ilgili '' NEREDE NEDEN OLDUĞUNU '' NEDEN SONRA '' komik kedi videoları 'END'le ilgili' ELSE 'ile ilgilidir. Bir "CASE" ifadesindeki ilk eşleşme sonucu belirler ... sadece COALESCE() 'nin NULL olmayan ilk argümanı gibi. Sen, arkadaşım, bizi gerçek problemden ziyade çözüm denemeni sormak için bizi bir klasik [XY problemine] (http://xyproblem.info) vermiş görünüyorsun. –

+0

Yardım etme çabanı takdir ediyorum. Ben, 'null bağlamının kendisini sarmalamak' ve sadece Haskell'in düşüncesinin monad tarzı gibi spesifik olanı tedavi etmek istiyorum, tüm bu kalçayı, zaten düşündüğüm gösterdiğiniz herşeyi istemiyorum. Bu tür birleştirme (f (sale.id, 'satışla ilgili'), f (satın alma ile ilgili 'bir satın alma ile ilgili')) gibi çözebiliyor olsaydım.Buradaki herkes, Haskell Belki monadının yaptığı gibi sezgisel olarak tedavi etmek istediğim bir "boş" veya "yokluk" bağlamı olduğunu anlamamış, fakat ... SQL'de – FtheBuilder

0

bu deneyin: Daha fazla yaklaşık Comparison Functions and Operators ve Control Flow Functions

Select IF(ISNULL(arg1), null, arg2) 

okuyun.

+0

Çok fazla kireç taşı var ve ben daha önceki cevabımda önerdiğiniz yaklaşım hakkında zaten bir şey söyledim. Sorularımın gereksinimlerini yerine getirecek bir işlev olan "myFunction (x, y)" işlevini tanımlamak istiyorum, bu IF işlevini kullanmayın. – FtheBuilder

İlgili konular