मेरे पास सैकड़ों कॉलम वाली एक टेबल है:
------------------------------------------------
ID ColA ColB ColC Col D ... ColZZZ
------------------------------------------------
1 bla
2 foo
3 bar
4 baz
------------------------------------------------
मुझे यह जानने की जरूरत है कि किन स्तंभों में कोई मान नहीं है (अर्थात: जो खाली हैं ''
NULL
नहीं)
मैं प्रत्येक कॉलम के लिए एक प्रश्न बना सकता हूं:
select count(1) from [table] where [ColA] <> ''; -- returns 2, so not, not empty
select count(1) from [table] where [ColB] <> ''; -- returns 1, so no
select count(1) from [table] where [ColC] <> ''; -- returns 0, so yay! found and empty one
...
etc
लेकिन इसके लिए कोई आसान तरीका होना चाहिए?
क्या खाली कॉलम के बिना [table]
वापस जाने का कोई तरीका है, दूसरे शब्दों में:
----------------------------
ID ColA ColB ColZZZ
----------------------------
1 bla
2 foo
3 bar
4 baz
----------------------------
2 जवाब
यहाँ इसका समाधान है। मैंने इस क्वेरी का उपयोग सभी तालिकाओं में खाली कॉलम खोजने से पहले किया था। गैर-रिक्त की खोज के लिए अब थोड़ा संशोधित किया गया है, इसमें कुछ अतिरिक्त भाग हो सकते हैं जिनकी आपके उदाहरण में आवश्यकता नहीं है।
आप कॉलम नामों को संग्रहीत करने के लिए एक अस्थायी तालिका बनाते हैं जो खाली नहीं हैं, और उन्हें खोजने के लिए गतिशील एसक्यूएल बनाने के लिए कर्सर का उपयोग करें।
अंत में, अस्थायी तालिका परिणामों के आधार पर कॉलम का चयन करने के लिए बस एक और गतिशील एसक्यूएल उत्पन्न करें।
IF (OBJECT_ID('tempdb..#tmpRez') IS NOT NULL) DROP TABLE #tmpRez;
CREATE TABLE #tmpRez (TableName sysname, ColName sysname);
DECLARE crs CURSOR LOCAL FAST_FORWARD FOR
SELECT t.name, c.name FROM sys.tables t
INNER JOIN sys.columns c ON c.object_id=t.object_id
WHERE 1=1
AND t.name = 'Table1' -- OR your own condition
OPEN crs;
DECLARE @tbl sysname;
DECLARE @col sysname;
DECLARE @sql NVARCHAR(MAX);
FETCH NEXT FROM crs INTO @tbl,@col;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sql = 'IF EXISTS (SELECT * FROM ['+ @tbl+'] WHERE [' + @col + '] <> '''') INSERT INTO #tmpRez SELECT ''' + @tbl +''','''+ @col + '''';
EXEC(@sql);
FETCH NEXT FROM crs INTO @tbl,@col;
END;
CLOSE crs;
DEALLOCATE crs;
SELECT @sql = 'SELECT ' + STUFF((SELECT ',' + ColName FROM #tmpRez x
where x.TableName = y.TableName
FOR XML PATH ('')), 1, 1, '') + ' FROM ' + TableName
FROM #tmpRez y GROUP BY TableName
EXEC (@sql)
null
मान होंगे (जो वे कभी नहीं करते हैं, इसके बजाय एक खाली स्ट्रिंग (''
) होगी)।
इसके बारे में कैसे कोई खाली कॉलम के साथ तालिका वापस करने के लिए:
SELECT * from table
WHERE column IS NOT NULL AND TRIM(column) <> ''
यह खाली कॉलम वाली तालिका को वापस करने के लिए है:
SELECT * from table
WHERE column IS NULL AND TRIM(column) = ''
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।