मैं पुराने मानों को सूची से नए मानों के साथ बदलकर एसक्यूएल में एक कॉलम पॉप्युलेट करने की कोशिश कर रहा हूं।

SELECT CHOOSE(ROUND(RAND() * 3, 1) + 1,'Bill','Steve','Jack')

इस क्वेरी को चलाने से मुझे NULLS के उदाहरण मिलते हैं जो मैं नहीं चाहता, मुझे NULLS क्यों मिल रहा है?

1
NoobCoder 1 जून 2020, 19:33

1 उत्तर

सबसे बढ़िया उत्तर

CHOOSE एक CASE व्यंजक के लिए केवल लघुरूप है। मैं इस बारे में बात करता हूं कि RAND() जैसी अभिव्यक्ति का मूल्यांकन एक से अधिक बार कैसे किया जा सकता है यहां (अनुभाग देखें "अभिव्यक्तियों का मूल्यांकन एक से अधिक बार किया जा सकता है")। मैं इसके बारे में यहां के बारे में भी बात करता हूं (खोजें "RAND()") के लिए पेज।

मूल रूप से, क्या होता है CHOOSE(expr, a, b) का विस्तार हो जाता है:

CASE
  WHEN expr = 1 THEN a
  WHEN expr = 2 THEN b
  ELSE NULL
END

हर बार जब आप वहां expr देखते हैं, तो इसका फिर से मूल्यांकन किया जा सकता है। तो पहली बार जब आप RAND() को कॉल करते हैं तो यह 2 उत्पन्न कर सकता है, फिर यह अगले WHEN पर चला जाता है, और इस बार यह 1 उत्पन्न कर सकता है, तो जो कुछ बचा है वह NULL है।

समाधान केवल एक बार RAND() उत्पन्न करना है, उदा।

DECLARE @rand tinyint = CONVERT(tinyint, (RAND()*3) + 1);

SELECT CHOOSE(@rand,'Bill','Steve','Jack');
2
Aaron Bertrand 1 जून 2020, 17:55