यदि आप चाहते हैं कि यह विशेष रूप से MYSQL द्वारा किया जाए और सभी स्तंभों की गणना किए बिना इस समाधान पर एक नज़र डालें।
इस पद्धति में आपको डेटाबेस कॉलम की संख्या को हार्ड कोडिंग करके बनाए रखने की आवश्यकता नहीं है। यदि आपकी तालिका स्कीमा संशोधित हो जाएगी तो यह विधि काम करेगी, और इसके लिए कोड परिवर्तन की आवश्यकता नहीं होगी।
SET @db = 'testing'; -- database
SET @tb = 'fuzzysearch'; -- table
SET @x = ''; -- will hold the column names with ASCII method applied to retrieve the number of the first char
SET @numcolumns = 0; -- will hold the number of columns in the table
-- figure out how many columns we have
SELECT count(*) into @numcolumns FROM information_schema.columns where [email protected] and [email protected];
-- we have to prepare some query from all columns of the table
SELECT group_concat(CONCAT('ASCII(',column_name,')') SEPARATOR ",") into @x from information_schema.columns where [email protected] and [email protected];
-- after this query we have a variable separated with comma like
-- ASCII(col1),ASCII(col2),ASCII(col3)
-- we now generate a query to concat the columns using comma as separator (null values are omitted from concat)
-- then figgure out how many times the comma is in that substring (this is done by using length(value)-length(replace(value,',',''))
-- the number returned is how many non null columns we have in that column
-- then we deduct the number from the known number of columns, calculated previously
-- the +1 is added because there is no comma for single value
SET @s = CONCAT('SELECT @numcolumns - (length(CONCAT_WS(\',\',', @x, '))-length(replace(CONCAT_WS(\',\',', @x, '),\',\',\'\')) + 1) FROM ',@db,'.',@tb,';');
PREPARE stmt FROM @s;
EXECUTE stmt;
-- after this execution we have returned for each row the number of null columns
-- I will leave to you to add a sum() group call if you want to find the null values for the whole table
DEALLOCATE PREPARE stmt;
एएससीआईआई का उपयोग पढ़ने से बचने के लिए किया जाता है, बिना कुछ लिए बहुत लंबे कॉलम को जोड़ना, एएससीआईआई हमें उन मूल्यों के लिए भी सुरक्षित बनाता है जहां पहला चार अल्पविराम (,) है।
चूंकि आप रिपोर्ट के साथ काम कर रहे हैं, इसलिए आपको यह मददगार लग सकता है क्योंकि यदि आप कोई विधि डालते हैं तो इसे प्रत्येक तालिका के लिए पुन:उपयोग किया जा सकता है।
मैंने यथासंभव अधिक से अधिक टिप्पणियां करने की कोशिश की।
आइए उपरोक्त कॉम्पैक्ट तरीके (रिवर्स वे) के टुकड़ों में विभाजित करें:
मैं इस तरह की एक क्वेरी समाप्त करना चाहता था
SELECT totalcolumns - notnullcolumns from table; -- to return null columns for each row
जबकि पहले वाले को चलाकर गणना करना आसान है:
SELECT count(*) FROM information_schema.columns where [email protected] and [email protected];
दूसरा एक गैर-स्तंभ थोड़ा दर्द है। MySQL में उपलब्ध कार्यों की जांच के एक टुकड़े के बाद, हम पाते हैं कि CONCAT_WS शून्य मानों को CONCAT नहीं करता है
तो इस तरह की क्वेरी चला रहे हैं:
SELECT CONCAT_WS(",","First name",NULL,"Last Name");
returns: 'First name,Last Name'
यह अच्छा है, हम गणना से शून्य मानों से छुटकारा पाते हैं। लेकिन हम कैसे प्राप्त करते हैं कि वास्तव में कितने कॉलम जुड़े हुए थे?
अच्छा यह मुश्किल है। वास्तव में संयोजित कॉलम प्राप्त करने के लिए हमें अल्पविराम+1 की संख्या की गणना करनी होगी।
इस ट्रिक के लिए हमने निम्न SQL नोटेशन का उपयोग किया
select length(value)-length(replace(value,',','')) +1 from table
ठीक है, तो अब हमारे पास संयोजित स्तंभों की संख्या है।
लेकिन कठिन हिस्सा आगे आ रहा है।
हमें CONCAT_WS() सभी मानों के लिए गणना करनी होगी।
हमें कुछ इस तरह की आवश्यकता है:
SELECT CONCAT_WS(",",col1,col2,col3,col4,col5);
यह वह जगह है जहां हमें तैयार बयानों का उपयोग करना है, क्योंकि हमें अभी तक अज्ञात कॉलम से गतिशील रूप से एक SQL क्वेरी तैयार करनी है। हम नहीं जानते कि हमारी टेबल में कितने कॉलम होंगे।
तो इसके लिए हम info_schema कॉलम टेबल के डेटा का उपयोग करते हैं। हमें टेबल नाम पास करने की जरूरत है, लेकिन डेटाबेस नाम भी, क्योंकि हमारे पास अलग-अलग डेटाबेस में एक ही टेबल नाम हो सकता है।
हमें एक क्वेरी की आवश्यकता है जो CONCAT_WS "स्ट्रिंग"
पर हमें col1,col2,col3,col4,col5 लौटाती हैतो इसके लिए हम एक क्वेरी चलाते हैं
SELECT group_concat(column_name SEPARATOR ",") into @x from information_schema.columns where [email protected] and [email protected];
एक और बात का जिक्र करना है। जब हमने यह पता लगाने के लिए लंबाई () और प्रतिस्थापित () विधि का उपयोग किया कि कितने कॉलम जुड़े हुए थे, हमें यह सुनिश्चित करना होगा कि हमारे पास मूल्यों के बीच अल्पविराम नहीं है। लेकिन यह भी ध्यान रखें कि हमारे डेटाबेस सेल में वास्तव में लंबे मान हो सकते हैं। इस दोनों ट्रिक के लिए हम ASCII ('वैल्यू') विधि का उपयोग करते हैं, जो पहले चार के ASCII चार को लौटाएगा, जो अल्पविराम नहीं हो सकता है और अशक्त स्तंभों के लिए वापस आ जाएगा।
कहा जा रहा है कि हम उपरोक्त व्यापक समाधान में यह सब जोड़ सकते हैं।