2013-08-09 12 views
8

मैं 4 कॉलम (आईडी (पी, पूर्णांक, नहीं शून्य), col1 (शून्य), col2 (शून्य), col3 (शून्य))क्या बाधाओं की जांच कर सकते हैं जैसे कि और?

क्रमांक एक चेक बाधा जोड़ना चाहते के साथ एक मेज है (टेबल स्तरीय मुझे लगता है कि) ताकि:

if col1 OR col2 are NOT NULL then col3 must be NULL 

और अगर col3 नहीं nULL तो col1 है और col2 शून्य होना चाहिए

यानी col3 अशक्त होना चाहिए, अगर col1 और col2 अशक्त या इसके विपरीत

नहीं हैं

मैं SQL और SQL सर्वर के लिए बहुत नया हूं हालांकि एक मुझे यकीन नहीं है कि वास्तव में इसे कैसे कार्यान्वित किया जाए या भले ही इसे कार्यान्वित किया जा सके?

मैं शायद लगता है:

CHECK ((col1 NOT NULL OR col2 NOT NULL AND col3 NULL) OR 
     (col3 NOT NULL AND col1 NULL AND col2 NULL)) 

लेकिन मुझे यकीन है कोष्ठक इस तरह तर्क समूह के लिए इस्तेमाल किया जा सकता है, तो नहीं कर रहा हूँ?

यदि नहीं, तो यह सर्वोत्तम कैसे लागू किया जा सकता है?

+0

नहीं, मेरे टेबल अन्य के बहुत सारे के साथ एक लाइव सर्वर पर कर रहे हैं कह सकते हैं कि सामान जो काम करता है, इसलिए मैं चीजों को पेंच नहीं करना चाहता: O – Toby

+2

क्या आपके पास समकक्ष विकास वातावरण नहीं है? – Yuck

+0

नहीं, यहां कोई भी सेट अप करने का कोई तरीका नहीं है, अन्यथा यह है कि मैंने कैसे शुरू किया होगा (जैसा कि मैंने एसक्यूएल में आईएम का बहुत नया उल्लेख किया है और यह नहीं पता होगा कि SQL सर्वर या डीबी को स्क्रैच से सेट करना शुरू करना है) – Toby

उत्तर

11

बिल्कुल, आप यह कर सकते हैं। यह sqlfiddle देखें।

हालांकि, आपको यह सुनिश्चित करना होगा कि आप अपने तर्क को सही तरीके से ब्रैकेट करें। आपको कभी समान ब्रैकेटिंग स्कोप में एंड्रॉइड और ओआरएस मिश्रण करना चाहिए। तो: अपने इरादे पर निर्भर करता है

(col1 NOT NULL OR (col2 NOT NULL AND col3 NULL)) 

:

(col1 NOT NULL OR col2 NOT NULL AND col3 NULL) 

बनने के लिए आवश्यक:

((col1 NOT NULL OR col2 NOT NULL) AND col3 NULL) 

या।

+0

धन्यवाद - स्क्वाइडल दिखाने के लिए भी धन्यवाद, यह पता नहीं था कि अस्तित्व में है, बहुत आसान होगा :) – Toby

+0

लेकिन क्या यह दोनों स्थितियों की जांच करेगा वाइसवर्सा भी ?? – Dhaval

+0

@ धावल: आप शायद यह इंगित करना चाहते हैं कि तर्क केवल '((कॉल 1 न्यूल और कॉल 2 न्यूल और कॉल 3 न्यूल) होना चाहिए या (col3 न्यूल और col1 न्यूल और col2 न्यूल))। इसके साथ समस्या यह है कि यह हमेशा लागू करेगा कि 'col1' और' col2' का एक ही राज्य है। मुझे लगता है कि ओपी ने जानबूझकर ऐसा नहीं किया क्योंकि 'col3'' _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – PinnyM

3

बस सावधान रहें ब्रैकेट के साथ गलती न करें।

CREATE TABLE Test1 (col1 INT, col2 INT, col3 INT); 


ALTER TABLE Test1 
ADD CONSTRAINT CHK1 
CHECK (((col1 IS NOT NULL OR col2 IS NOT NULL) AND col3 IS NULL) OR 
     ((col1 IS NULL AND col2 IS NULL) AND col3 IS NOT NULL)) 



INSERT INTO Test1 VALUES (1,1,1); --fail 
INSERT INTO Test1 VALUES (1,1,NULL); --good 
INSERT INTO Test1 VALUES (1,NULL,NULL); --good 
INSERT INTO Test1 VALUES (1,NULL,1); --fail 
INSERT INTO Test1 VALUES (NULL,NULL,1); --good 
1

मैं

नीचे
create FUNCTION dbo.fn_check_val 
    (@col1 int , @col2 int , @col3 int) 
RETURNS bit 
AS 
BEGIN 
    declare @toRet bit 
    IF(@col1 is Not null OR @col2 is NOT NULL) 
    Begin 
     if(@col3 is null) 
     Begin 
      Set @toRet = 1 
     End 
     Else 
     Begin 
      Set @toRet = 0 
     End 
    End 
    Else 
    if(@col3 is not null) 
    Begin 
     Set @toRet = 1 
    End 
    Else 
    Begin 
     Set @toRet = 0 
    End 
return @toRet 
END 

की तरह एक यूडीएफ बनाने और उसके बाद अपनी तालिका में निम्नलिखित जांच बयान जोड़ने

([dbo].[fn_check_val]([col1],[col2],[col3])=(1)) 
+0

वाह, जो मेरे सिर पर अब तक है ! क्या आप समझा सकते हैं कि ऐसा क्यों करना सरल और/या बाधा से बेहतर होगा? – Toby

+1

@Toby .. आप सही हैं ... मैंने अभी यह समझाया है कि यह किया जा सकता है – Dhaval

संबंधित मुद्दे