sql - किसी तालिका से कॉलम का चयन कैसे करें जिसमें गैर शून्य मान हैं?




oracle select null (6)

आप जो करना चाहते हैं वह पूरे परिणाम में प्रत्येक पंक्ति पर निर्भरता स्थापित करना है। वास्तव में यह वही नहीं है जो आप चाहते हैं। बस रैमिकेशंस के बारे में सोचें यदि एक पंक्ति में प्रत्येक कॉलम में '0' का मान होता है - अचानक आपके परिणाम सेट की स्कीमा उन सभी "रिक्त" कॉलम को शामिल करने के लिए बढ़ती है। आप तेजी से '*' की बुरी तरह बढ़ रहे हैं, अब आपका परिणाम सेट केवल तालिका के मेटा-डेटा पर निर्भर नहीं है - लेकिन आपका पूरा परिणाम सेट सादा डेटा पर निर्भर है।

आप जो करना चाहते हैं वह सिर्फ उन फ़ील्ड का चयन करें जो आप चाहते हैं, और इस सरल योजना से विचलित नहीं हैं।

मेरे पास एक सारणी है जिसमें सैकड़ों कॉलम हैं जिनमें से कई शून्य हैं, और मुझे अपना चयन कथन चाहिए, ताकि केवल वे कॉलम वाले मान को वापस कर दिया जाए। यह मुझे डेटा का बेहतर विश्लेषण करने में मदद करेगा। कुछ इस तरह:

Tablename से (गैर शून्य कॉलम) का चयन करें;

मैं उन सभी कॉलम का चयन करना चाहता हूं जिनमें कम से कम एक गैर-शून्य मान हो।

क्या यह किया जा सकता है?


सांख्यिकी जानकारी के रूप में एक नज़र डालें, यह आपके लिए उपयोगी हो सकता है:

SQL> exec dbms_stats.gather_table_stats('SCOTT','EMP');

PL/SQL procedure successfully completed.

SQL> select num_rows from all_tables where owner='SCOTT' and table_name='EMP';

  NUM_ROWS
----------
        14

SQL> select column_name,nullable,num_distinct,num_nulls from all_tab_columns
  2  where owner='SCOTT' and table_name='EMP' order by column_id;

COLUMN_NAME                    N NUM_DISTINCT  NUM_NULLS
------------------------------ - ------------ ----------
EMPNO                          N           14          0
ENAME                          Y           14          0
JOB                            Y            5          0
MGR                            Y            6          1
HIREDATE                       Y           13          0
SAL                            Y           12          0
COMM                           Y            4         10
DEPTNO                         Y            3          0

8 rows selected.

उदाहरण के लिए आप "खाली" कॉलम की पहचान करने के लिए NUM_NULLS = NUM_ROWS जांच सकते हैं या नहीं।
संदर्भ: ALL_TAB_COLUMNS , ALL_TABLES


नीचे का प्रयोग करें:

SELECT *
FROM information_schema.columns
WHERE table_name = 'Table_Name' and is_nullable = 'NO'

Table_Name को तदनुसार बदला जाना है ...


मुझे नहीं लगता कि यह एक ही प्रश्न में किया जा सकता है। पहले कुछ परीक्षण करने के लिए आपको कुछ plsql की आवश्यकता हो सकती है कि कौन से कॉलम में डेटा होता है और उस जानकारी के आधार पर एक कथन डालता है। बेशक, यदि आपकी तालिका में डेटा बदलता है तो आपको कथन को फिर से बनाना होगा।

declare

   l_table          varchar2(30) := 'YOUR_TABLE';
   l_statement      varchar2(32767);
   l_test_statement varchar2(32767);

   l_contains_value pls_integer;

   -- select column_names from your table
   cursor c is
      select column_name
            ,nullable
        from user_tab_columns
       where table_name = l_table;

begin
   l_statement := 'select ';
   for r in c
   loop
      -- If column is not nullable it will always contain a value
      if r.nullable = 'N'
      then
         -- add column to select list.
         l_statement := l_statement || r.column_name || ',';
      else
         -- check if there is a row that has a value for this column
         begin
            l_test_statement := 'select 1 from dual where exists (select 1 from ' || l_table || ' where ' ||
                                r.column_name || ' is not null)';
            dbms_output.put_line(l_test_statement);
            execute immediate l_test_statement
               into l_contains_value;


            -- Yes, add column to select list
            l_statement := l_statement || r.column_name || ',';
         exception
            when no_data_found then
               null;
         end;

      end if;
   end loop;

   -- create a select statement
   l_statement := substr(l_statement, 1, length(l_statement) - 1) || ' from ' || l_table;

end;

select column_name
from user_tab_columns
where table_name='Table_name' and num_nulls=0;

गैर नल कॉलम प्राप्त करने के लिए यहां सरल कोड है ..


यदि आप SELECT * INTO तालिका का उपयोग करके सभी कॉलम सम्मिलित करना चाहते हैं तो आप इसे आजमा सकते हैं।

SELECT  *
INTO    Table2
FROM    Table1;




sql oracle select null