मेरे पास सैकड़ों कॉलम वाली एक टेबल है:

------------------------------------------------
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
----------------------------
0
Pr0no 16 मार्च 2020, 04:38
1
नहीं, SQL क्वेरी में स्तंभों का एक निश्चित सेट होता है। आप सशर्त रूप से संपूर्ण कॉलम नहीं चुन सकते।
 – 
Gordon Linoff
16 मार्च 2020, 04:41
तो मुझे उनके द्वारा 1 बाय 1 जाना होगा, जो खाली हैं, और फिर उन कॉलमों को मेरे चयन या जहां क्लॉज में जोड़े बिना मेरे अगले प्रश्नों का निर्माण करना है? मैं इसे करने को तैयार हूं, लेकिन क्या गतिशील रूप से ऐसा करने का कोई तरीका नहीं होना चाहिए?
 – 
Pr0no
16 मार्च 2020, 04:49
यह सिस्टम व्यू sys.colums पर एक कर्सर का उपयोग करके गतिशील रूप से किया जा सकता है ... मैंने खाली कॉलम की तलाश में कुछ ऐसा ही किया है, मैं इसे खोजने और उदाहरण के रूप में इसे फिर से लिखने का प्रयास करूंगा ...
 – 
Nenad Zivkovic
16 मार्च 2020, 04:59

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)
1
Nenad Zivkovic 16 मार्च 2020, 05:15
इसके लिए बहुत धन्यवाद! लेकिन क्या मैं सही हूं कि यह केवल तभी काम करेगा जब कॉलम में null मान होंगे (जो वे कभी नहीं करते हैं, इसके बजाय एक खाली स्ट्रिंग ('') होगी)।
 – 
Pr0no
16 मार्च 2020, 05:15
- हाँ, आप सही हैं - यहाँ अब इसे खाली स्ट्रिंग देखने के लिए संशोधित किया गया है
 – 
Nenad Zivkovic
16 मार्च 2020, 05:18

इसके बारे में कैसे कोई खाली कॉलम के साथ तालिका वापस करने के लिए:

SELECT * from table 
WHERE column IS NOT NULL AND TRIM(column) <> ''

यह खाली कॉलम वाली तालिका को वापस करने के लिए है:

SELECT * from table 
WHERE column IS NULL AND TRIM(column) = ''
0
Nicole Douglas 16 मार्च 2020, 05:33