sql-server - SQL सर्वर दृश्य में उपयोग के लिए कॉलम मूल्यों को ओवरराइड करने के लिए सशर्त तर्क के साथ टी-एसक्यूएल का उपयोग करें




tsql sql-server-2012 (2)

मुझे वर्तमान दृश्य में मौजूद डेटा (यह चपटा हुआ है) लेने की आवश्यकता है और इसकी प्रस्तुति को बदलने के लिए पंक्ति-दर-पंक्ति आधार पर कुछ सशर्त तर्क लागू करें। आदर्श रूप से इस डेटा को उपयोगकर्ताओं द्वारा एसएसएमएस 2012 (प्रश्न में डेटाबेस माइक्रोसॉफ्ट एसक्यूएल सर्वर 2012) से एक्सेस किए जा सकते हैं। मैं टी-एसक्यूएल गुरू नहीं हूं या नई सुविधाओं के बारे में जानता हूं जो कि SQL सर्वर इस को पूरा करने की पेशकश कर सकता है। मेरा प्रारंभिक विचार कर्सर और कुछ फ़ंक्शंस (मैं एक सी # डेवलपर का अधिक है) का उपयोग करना था, लेकिन यह सुनिश्चित नहीं था कि यह दृश्य के माध्यम से कैसे पहुंचा जा सकता है (मुख्य आवश्यकता)। मैं इसके बजाय डेटाबेस में किसी भी नए टेबल बनाने से बचना चाहूंगा (यदि संभव हो तो)

नीचे वर्तमान डेटा का एक नमूना है (जैसे- Is) साथ में उपयोगकर्ताओं को यह दिखाने के लिए कि कैसे प्रदर्शित होता है (अब तक)। नियम जो डेटा को कैसे प्राप्त होता है को प्रभावित करते हैं नीचे सूचीबद्ध हैं

As-Is (actual source of data):

PK  MainValue   Signal1 Signal2 Signal3 Signal4 Signal5
1   12345       XYZ     12345   NULL    NULL    NULL    
2   90210       ABC     99999   90210   NULL    NULL    
3   970622      XYZ     88888   34652   970622  NULL


To-Be (how the users would like the data displayed):

PK  MainValue   Signal1 Signal2 Signal3 Signal4 Signal5
1   12345       XYZ     XYZ     XYZ     XYZ     XYZ
2   90210       ABC     99999   99999   99999   99999   
3   970622      XYZ     88888   34652   34652   34652

नियम :

  • [MainValue] फ़ील्ड की जांच करें और पहले [Signal#] फ़ील्ड के साथ एक मैच खोजने का प्रयास करें जो हम पाते हैं (हमेशा डेटा के प्रत्येक पंक्ति के लिए [Signal1] से शुरू होता है
  • एक बार जब हम एक मैच प्राप्त करते हैं तो हम पिछले सिग्नल फ़ील्ड को देखते हैं (उदाहरण के लिए यदि हमें [MainValue] और [Signal3] बीच एक मैच मिला है तो हम [MainValue] का प्रयोग हमारे वास्तविक स्रोत के रूप में करेंगे)।
  • आंकड़ों के इस स्रोत को लें और अब सभी फ़ील्ड के लिए विकल्प चुनें जहां हमने मैच को अंतिम सिग्नल [सिग्नल 5] फ़ील्ड तक पहुंचाया।

यह हर पंक्ति के लिए करें केवल एक सिग्नल फ़ील्ड होनी चाहिए जो मैच हो और हम हिट पाने के बाद हम एक मैच बनाने की कोशिश करना बंद कर दें।


Answers

आपको nullif साथ nullif को संयोजित करने की आवश्यकता है, इस तरह से:

declare @source table (PK int, MainValue varchar(6), Signal1 varchar(6), Signal2 varchar(6), Signal3 varchar(6), Signal4 varchar(6), Signal5 varchar(6))
insert into @source values
(1, '12345', 'XYZ', '12345', null, null, null),
(2, '90210', 'ABC', '99999', '90210', null, null),
(3, '970622', 'XYZ', '88888', '34652', '970622', null)

select 
    PK,
    MainValue, 
    nullif(Signal1, MainValue) as Signal1,
    coalesce(nullif(Signal2, MainValue), nullif(Signal1, MainValue)) as Signal2,
    coalesce(nullif(Signal3, MainValue), nullif(Signal2, MainValue), nullif(Signal1, MainValue)) as Signal3,
    coalesce(nullif(Signal4, MainValue), nullif(Signal3, MainValue), nullif(Signal2, MainValue), nullif(Signal1, MainValue)) as Signal4,
    coalesce(nullif(Signal5, MainValue), nullif(Signal4, MainValue), nullif(Signal3, MainValue), nullif(Signal2, MainValue), nullif(Signal1, MainValue)) as Signal5
from @source

पिछली क्वेरी केवल तभी काम करती है अगर मैच के बाद शेष संकेतों में शून्य मान हैं। अगर ऐसा नहीं है, तो आपको इसका उपयोग करना होगा:

;with cte (PK, MainValue, Signal1 , Signal2, Signal3, Signal4, Signal5) as 
(
    select 
        PK,
        MainValue,
        nullif(Signal1, MainValue),
        case when nullif(Signal1, MainValue) is null then null else nullif(Signal2, MainValue) end,
        case when nullif(Signal1, MainValue) is null or nullif(Signal2, MainValue) is null then null else nullif(Signal3, MainValue) end,
        case when nullif(Signal1, MainValue) is null or nullif(Signal2, MainValue) is null or nullif(Signal3, MainValue) is null then null else nullif(Signal4, MainValue) end,
        case when nullif(Signal1, MainValue) is null or nullif(Signal2, MainValue) is null or nullif(Signal3, MainValue) is null or nullif(Signal4, MainValue) is null then null else nullif(Signal5, MainValue) end
    from @source
)
select 
    PK,
    MainValue,
    Signal1,
    coalesce(Signal2, Signal1) as Signal2,
    coalesce(Signal3, Signal2, Signal1) as Signal3,
    coalesce(Signal4, Signal3, Signal2, Signal1) as Signal4,
    coalesce(Signal5, Signal4, Signal3, Signal2, Signal1) as Signal5    
from cte

डिफ़ॉल्ट मान के साथ मौजूदा डेटाबेस तालिका में कॉलम जोड़ने के लिए, हम इसका उपयोग कर सकते हैं:

ALTER TABLE [dbo.table_name]
    ADD [Column_Name] BIT NOT NULL
Default ( 0 )

डिफ़ॉल्ट मान के साथ मौजूदा डेटाबेस तालिका में कॉलम जोड़ने का दूसरा तरीका यहां दिया गया है।

एक डिफ़ॉल्ट मान के साथ कॉलम जोड़ने के लिए एक बहुत अधिक संपूर्ण SQL स्क्रिप्ट नीचे है, यह जांचने से पहले कि कॉलम मौजूद होने से पहले मौजूद है या नहीं, यह जांच भी शामिल है कि बाधा जांचें और यदि कोई हो तो उसे छोड़ दें। इस स्क्रिप्ट में बाधा का भी नाम है, इसलिए हमारे पास एक अच्छा नामकरण सम्मेलन हो सकता है (मुझे डीएफ_ पसंद है) और यदि एसक्यूएल हमें ऐसे नाम से बाधा नहीं देगा जिसमें यादृच्छिक रूप से जेनरेट किया गया नंबर है; तो यह भी बाधा का नाम देने में सक्षम होना अच्छा है।

-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = 'table_Emplyee'
              AND COLUMN_NAME = 'Column_EmployeeName'
           )
    BEGIN

        IF EXISTS ( SELECT 1
                    FROM sys.default_constraints
                    WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
                      AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
                  )
            BEGIN
                ------  DROP Contraint

                ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
            PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
            END
     --    -----   DROP Column   -----------------------------------------------------------------
        ALTER TABLE [dbo].table_Emplyee
            DROP COLUMN Column_EmployeeName
        PRINT 'Column Column_EmployeeName in images table was dropped'
    END

--------------------------------------------------------------------------
-- ADD  COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
                SELECT 1
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'table_Emplyee'
                  AND COLUMN_NAME = 'Column_EmployeeName'
               )
    BEGIN
    ----- ADD Column & Contraint
        ALTER TABLE dbo.table_Emplyee
            ADD Column_EmployeeName BIT   NOT NULL
            CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]  DEFAULT (0)
        PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
        PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
     END

GO

डिफ़ॉल्ट मान के साथ मौजूदा डेटाबेस तालिका में कॉलम जोड़ने के दो तरीके हैं।





sql sql-server tsql sql-server-2012