2012-02-04 16 views
12

Veritabanımda "type" olarak adlandırılan bir alanı "tinyInt" olarak saklıyorum, çünkü o kadar çok türde olmadığım için, tüm bu türlerin karşılık gelen adlarını saklamak için bir tablo oluşturmamaya karar verdim.Harita dizgisi (id) metin dizgisine mi?

Tablomu sorguladığımda, türlerin php dizilerinde sakladığım karşılık gelen adlarla değiştirilmesini istiyorum. Sonuçları değiştirerek ve iade edilen sonuç satırında değiştirme yapmak yerine, bu değişimin sql ifadesinin içinde yapılmasının bir yolu olup olmadığını merak ediyorum.

SELECT *, CASE type WHEN 1 THEN 'abc' WHEN 2 THEN 'xyz' END as stringType 
FROM orders 

Ayrıca ELSE kullanabilirsiniz: Bunu yapmak için

select *, map(type, {1=>'abc', 2 => 'xyz'}) from orders 

cevap

18

tek yolu (Oldukça eminim) bir CASE .. WHEN ... yapısı kullanıyor:

böyle bir şey bile var mı varsayılanı belirtmek için CASE type WHEN 1 THEN 'abc' WHEN 2 THEN 'xyz' ELSE 'unknown' END.

7

Aslında mathematical.coffee tarafından cevap aksine, aslında bir sayıyı metne eşleştirmek için MySQL başka bir yolu yoktur - Rakamlarınız bitişik olan en az ise:

ELT() işlevini verir N - dize listesinin birinci öğesi: str1N = 1, str2N = 2 ise, vb. N'un 1'den küçük veya argüman sayısından büyük olması durumunda NULL döndürür.

Örnek:

mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo'); 
     -> 'ej' 
mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo'); 
     -> 'foo' 

Kaynak:

https://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_elt