मैंने कई उत्तर पढ़े हैं लेकिन वे सभी पीएल/एसक्यूएल या ओरेकल के लिए हैं, मुझे माइक्रोसॉफ्ट एसक्यूएल-सर्वर के लिए कुछ भी नहीं मिला।

मेरी टेबल :

CREATE TABLE StudentScore
(
  Student_ID INT PRIMARY KEY,
  Student_Name NVARCHAR (50),
  Student_Score INT
) 

GO

INSERT INTO StudentScore VALUES (1,'Ali', NULL)
INSERT INTO StudentScore VALUES (2,'Zaid', 770)
INSERT INTO StudentScore VALUES (3,'Mohd', 1140)
INSERT INTO StudentScore VALUES (4,NULL, 770)
INSERT INTO StudentScore VALUES (5,'John', 1240)
INSERT INTO StudentScore VALUES (6,'Mike', 1140)
INSERT INTO StudentScore VALUES (7,'Goerge', NULL)
  1. सभी नॉन-नल कॉलम के नाम कैसे पता करें।
  2. केवल अशक्त स्तंभों वाली वापसी तालिका

टिप्पणियों के आधार पर संपादित करें:

मैं IS_NULLABLE की विशेषता से अवगत हूं Information_schema । लेकिन सिर्फ इसलिए कि एक कॉलम शून्य मानों की अनुमति देता है इसका मतलब यह नहीं है कि इसमें वास्तव में शून्य मान होंगे। उन स्तंभों का पता कैसे लगाएं जिनमें वास्तव में शून्य मान हैं।

मैं Microsoft SQL-SERVER के समतुल्य कुछ num_nulls ढूंढ रहा हूं।

-1
noob 25 अप्रैल 2020, 16:40

2 जवाब

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

आप इसे जारी करके प्राप्त कर सकते हैं:

SELECT 
  FORMATMESSAGE('SELECT col = ''%s.%s.%s'' FROM %s.%s HAVING COUNT(*) != COUNT(%s)', 
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME)
  )
FROM INFORMATION_SCHEMA.COLUMNS
WHERE IS_NULLABLE = 'YES';

db<>fiddle डेमो

यह अलग-अलग कॉलम की जांच के लिए स्क्रिप्ट तैयार करेगा।

HAVING COUNT(*) != COUNT(col_name) -- it means that column contains at least single NULL

HAVING COUNT(col_name) = 0 AND COUNT(*) != 0 -- it means all values in columns are NULL

प्रति तालिका एकल क्वेरी प्राप्त करने के लिए STRING_AGG का उपयोग करके इस दृष्टिकोण को पॉलिश किया जा सकता है और गतिशील SQL के साथ आप क्वेरी को कॉपी करने की आवश्यकता से बच सकते हैं।

संपादित करें:

पूरी तरह से बेक किया हुआ घोल:

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = STRING_AGG(
  FORMATMESSAGE('SELECT table_schema = ''%s''
                        ,table_name = ''%s''
                        ,table_col_name = ''%s'' 
                        ,row_num = COUNT(*)
                        ,row_num_non_nulls = COUNT(%s)
                        ,row_num_nulls = COUNT(*) - COUNT(%s)
                 FROM %s.%s', 
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(COLUMN_NAME),
     QUOTENAME(TABLE_SCHEMA),
     QUOTENAME(TABLE_NAME),
     QUOTENAME(COLUMN_NAME)), ' UNION ALL' + CHAR(13)
               ) WITHIN GROUP(ORDER BY TABLE_SCHEMA, TABLE_NAME)

FROM INFORMATION_SCHEMA.COLUMNS
WHERE IS_NULLABLE = 'YES'
  AND TABLE_NAME = ?        -- filter by table name
  AND TABLE_SCHEMA = ?;     -- filter by schema name

SELECT @sql;
EXEC(@sql);

db<>fiddle डेमो

आउटपुट:

+---------------+-----------------+------------------+----------+--------------------+---------------+
| table_schema  |   table_name    | table_col_name   | row_num  | row_num_non_nulls  | row_num_nulls |
+---------------+-----------------+------------------+----------+--------------------+---------------+
| [dbo]         | [StudentScore]  | [Student_Name]   |       7  |                 6  |             1 |
| [dbo]         | [StudentScore]  | [Student_Score]  |       7  |                 5  |             2 |
+---------------+-----------------+------------------+----------+--------------------+---------------+    
1
Lukasz Szozda 26 अप्रैल 2020, 11:40

शायद आप INFORMATION_SCHEMA.COLUMNS. कॉलम IS_NULLABLE यह जानकारी प्रदान करता है।

ध्यान दें कि INFORMATION_SCHEMA टेबल (ठीक है, वे वास्तव में विचार हैं) मानक SQL हैं, इसलिए यह जानकारी अधिकांश डेटाबेस में उपलब्ध है। Oracle ने उन्हें (अभी तक?) नहीं अपनाया है।

1
Gordon Linoff 25 अप्रैल 2020, 16:41