2009-05-29 12 views
13

के साथ पूर्णांक को प्रतिस्थापित करने का चयन करें लक्ष्य एक पूर्णांक मान को प्रतिस्थापित करने के लिए है जो एसक्यूएल क्वेरी में लौटाए गए चार मान के साथ होता है जो संख्या दर्शाता है। उदाहरण के लिए:एसक्यूएल स्ट्रिंग

'स्पोर्ट' लेबल वाली एक तालिका विशेषता को 1-4 के बीच एक पूर्णांक मान के रूप में परिभाषित किया गया है। 1 = बास्केटबॉल, 2 = हॉकी, आदि नीचे डेटाबेस तालिका और फिर वांछित आउटपुट है।

डेटाबेस तालिका:

Player  Team  Sport 
-------------------------- 
Bob  Blue  1 
Roy  Red  3 
Sarah  Pink  4 

वांछित आउटपुट:

Player  Team  Sport 
------------------------------ 
Bob  Blue  Basketball 
Roy  Red  Soccer 
Sarah  Pink  Kickball 

स्ट्रिंग मान के लिए इन पूर्णांक मूल्यों का अनुवाद करने के लिए सबसे अच्छा तरीका क्या है? कार्यक्रम में गुजरने से पहले मानों का अनुवाद करने के लिए एसक्यूएल का प्रयोग करें? कार्यक्रम के भीतर मूल्य बदलने के लिए स्क्रिप्टिंग भाषा का प्रयोग करें? डेटाबेस डिजाइन बदलें?

उत्तर

16

डेटाबेस को मान रखना चाहिए और आपको उस तालिका में शामिल होना चाहिए जिसमें उस डेटा का डेटा हो।

तो तुम एक तालिका जो कहते हैं कि

आईडी नाम FavSport लोगों की एक सूची
1 एलेक्स 4
2 Gnats 2

और फिर एक और तालिका जो एक सूची है है होना चाहिए खेल

आईडी स्पोर्ट
1 बास्केटबॉल
2 फुटबॉल
3 फ़ुटबॉल
4 किक बॉल

तो फिर तुम एक इन तालिकाओं के बीच में शामिल होने के क्या करना होगा

select people.name, sports.sport 
from people, sports 
where people.favsport = sports.ID 

तुम वापस देना होगा जो

नाम स्पोर्ट
एलेक्स किकबॉल
गाना फुटबॉल

आप केस स्टेटमेंट का भी उपयोग कर सकते हैं उदाहरण के लिए। बस ऊपर से लोगों की तालिका का उपयोग करके आप

select name, 
     case 
     when favsport = 1 then 'Basketball' 
     when favsport = 2 then 'Football' 
     when favsport = 3 then 'Soccer' 
     else 'Kickball' 
     end as "Sport" 
from people 

जैसे कुछ लिख सकते हैं लेकिन यह निश्चित रूप से सबसे अच्छा अभ्यास नहीं है।

+1

अच्छा लगता है। दुर्भाग्य से इस परियोजना पर मुझे डेटाबेस में परिवर्तन या परिवर्तन करने की क्षमता नहीं दी गई है। तो मुझे केस स्टेटमेंट के साथ जाना पड़ सकता है। हालांकि, जॉइन टेबल पूरी समझ में आता है। मैं वास्तव में PHP के साथ एक ही चीज़ कर रहा था, मैंने एक फ़ंक्शन बनाया जिसे मैंने विशेषता नाम और मान पास किया था। इसके बाद मैंने एक इंडेक्स सरणी की जांच की जिसे मैंने देखा कि स्ट्रिंग किस मूल्य से मेल खाती है। तो अनिवार्य रूप से एक ही बात है। आपके प्रतिक्रिया के लिए धन्येवाद। – Cimplicity

+0

आपको स्थायी तालिका बनाने की आवश्यकता नहीं है। यह सबसे अच्छा होगा लेकिन डीबीएमएस के आधार पर अन्य विकल्प भी हैं। अस्थायी सारणी, सामान्य तालिका अभिव्यक्तियां, तालिका मूल्य रचनाकार। –

2

CASE अभिव्यक्ति सहायता कर सकती है। हालांकि, यह किसी पूर्णांक प्राथमिक कुंजी के साथ एक छोटी सी मेज और एक name स्ट्रिंग जैसे

1 baseball 
2 football 

आदि, और JOIN यह उचित रूप से क्वेरी में है करने के लिए भी तेजी से हो सकता है।

8

MySQL एक CASE बयान है। एसक्यूएल सर्वर में निम्नलिखित काम करता है:

SELECT 
    CASE MyColumnName 
     WHEN 1 THEN 'First' 
     WHEN 2 THEN 'Second' 
     WHEN 3 THEN 'Third' 
     ELSE 'Other' 
    END 
+0

हां। लेकिन एक जॉइन अभी भी बेहतर हो सकता है (बेंचमार्क एक जरूरी है ;-)। –

+0

हां यह करता है, लेकिन यह वास्तव में यहां सही दृष्टिकोण नहीं है। –

1

आपको लगता है यह पूर्णांकों और डेटाबेस में ही तार के बीच इन संबंधों को स्टोर करने के लिए मददगार होगा है? जब तक आपको इन रिश्तों को स्टोर करना होता है, तब तक यह आपके कोड के बजाय इसे आपके डेटा (डेटाबेस में) के करीब स्टोर करने के लिए समझ में आता है, जहां यह खो सकता है। यदि आप इस समाधान का उपयोग करते हैं, तो यह पूर्णांक को किसी अन्य तालिका में मानों के लिए एक विदेशी कुंजी बना देगा। sport_id और sport के साथ sports कहें, और अपनी क्वेरी के हिस्से के रूप में उनसे जुड़ें, आप किसी अन्य तालिका में पूर्णांक स्टोर करते हैं।

SELECT * FROM my_table के बजाय आप SELECT * from my_table और appropriate join का उपयोग करेंगे। यदि आपके मुख्य कॉलम में प्रत्येक पंक्ति में एक समान खेल नहीं है, तो आप बाएं शामिल होने का उपयोग कर सकते हैं, अन्यथा दोनों तालिकाओं से चयन कर सकते हैं और = जहां क्लॉज संभवतः पर्याप्त है।

1

निश्चित रूप से डीबी स्ट्रिंग मान हो सकते है। मैं किसी भी माध्यम से डीबी विशेषज्ञ नहीं हूं, लेकिन मैं अनुशंसा करता हूं कि आप एक सारणी बनाते हैं जिसमें तार और उनके संबंधित पूर्णांक मान होते हैं। वहां से, आप दो तालिकाओं के बीच संबंध परिभाषित कर सकते हैं और फिर पूर्णांक के स्ट्रिंग संस्करण को खींचने के लिए चयन में जॉइन कर सकते हैं।

tblSport Columns 
------------ 
SportID int (PK, eg. 12) 
SportName varchar (eg. "Tennis") 


tblFriend Columns 
------------ 
FriendID int (PK) 
FriendName (eg. "Joe") 
LikesSportID (eg. 12) 


In this example, you can get the following result from the query below: 
SELECT FriendName, SportName 
FROM tblFriend 
INNER JOIN tblSport 
ON tblFriend.LikesSportID = tblSport.SportID 

मैन, देर हो चुकी है - मुझे आशा है कि मुझे यह अधिकार मिल जाएगा। वैसे, आपको विभिन्न प्रकार के जॉइन पर पढ़ना चाहिए - यह एक का सबसे सरल उदाहरण है।

3

ऑरैकल में आप DECODE फ़ंक्शन का उपयोग कर सकते हैं जो एक समाधान प्रदान करेगा जहां डेटाबेस का डिज़ाइन आपके नियंत्रण से बाहर है।

enter image description here

ओरेकल documentation से

सीधे:

उदाहरण: इस उदाहरण मूल्य warehouse_id डीकोड। यदि वेयरहाउस_आईड 1 है, तो फ़ंक्शन 'साउथलेक' लौटाता है; अगर वेयरहाउस_आईड 2 है, तो यह 'सैन फ्रांसिस्को' लौटाता है; इत्यादि। यदि वेयरहाउस_आईड 1, 2, 3, या 4 नहीं है, तो फ़ंक्शन 'गैर घरेलू' लौटाता है।

SELECT product_id, 
     DECODE (warehouse_id, 1, 'Southlake', 
          2, 'San Francisco', 
          3, 'New Jersey', 
          4, 'Seattle', 
           'Non domestic') "Location" 
    FROM inventories 
    WHERE product_id < 1775 
    ORDER BY product_id, "Location"; 
संबंधित मुद्दे