2012-01-11 10 views
5

मैं निम्नलिखित प्रश्न हैं:SQL क्वेरी - हार्ड-कोडेड मूल्यों से छुटकारा पाने

Select Name, 
     case when charindex('I',a.S_Data) > 0 then 1 else 0 end as Illustrated, 
     case when charindex('FP',a.S_Data) > 0 then 1 else 0 end as FrontPage, 
     case when charindex('BP',a.S_Data) > 0 then 1 else 0 end as BackPage, 
     case when charindex('ELP',a.S_Data) > 0 then 1 else 0 end as EDLP, 
     case when charindex('PR',a.S_Data) > 0 then 1 else 0 end as SpecialPromo 
From Table1 

मुझे क्या करना चाहते हैं लुकअप तालिका में किसी प्रकार का या एक सेटिंग तालिका में उन फिल्टर मान संग्रहीत करने के लिए है।

मैं इस क्वेरी के साथ उपयोग करने के लिए लुकअप टेबल से मूल्यों को आकर्षित करने के तरीके से संघर्ष कर रहा हूं।

+6

सुनिश्चित करें कि आप कितना लाभ होगा, के बाद से मैं आप अभी भी हार्डकोडेड स्तंभ नाम चाहते हैं ('Illustrated' संभालने हूँ, 'फ्रंट पेज', आदि) आपके परिणाम सेट में उन मानों से जुड़े हैं। –

+0

इस चयन के लिए एक दृश्य बनाने के बारे में क्या? –

+0

जो मैंने सोचा था - यानी, "क्या यह इसके लायक है?" – Perplexed

उत्तर

3

मैं कम से कम दो विकल्प के बारे में सोच सकते हैं ...

CREATE TABLE constants (
    id    AS INT, 
    Illustrated  AS VARCHAR(3), 
    FrontPage  AS VARCHAR(3), 
    BackPage   AS VARCHAR(3), 
    EDLP    AS VARCHAR(3), 
    SpecialPromo  AS VARCHAR(3) 
) 

INSERT INTO constants SELECT 1, 'I', 'FP', 'BP', 'ELP', 'PR' 

SELECT 
    Name, 
    CASE WHEN CHARINDEX(constants.Illustrated, data.S_Data) > 0 THEN 1 ELSE 0 END AS Illustrated, 
    etc, etc 
FROM 
    data 
INNER JOIN 
    constants 
    ON constants.id = 1 

या ...

CREATE TABLE constants (
    constant_set_id AS INT, 
    constant_name AS VARCHAR(16), 
    value   AS AS VARCHAR(3) 
) 

INSERT INTO constants SELECT 1, 'Illustrated', 'I' 
INSERT INTO constants SELECT 1, 'FrontPage', 'FP' 
INSERT INTO constants SELECT 1, 'BackPage',  'BP' 
INSERT INTO constants SELECT 1, 'EDLP',   'ELP' 
INSERT INTO constants SELECT 1, 'SpecialPromo', 'PR' 

SELECT 
    Name, 
    MAX(CASE WHEN constants.constant_name = 'Illustrated' AND CHARINDEX(constants.value, data.S_Data) > 0 THEN 1 ELSE 0 END) AS Illustrated, 
    etc, etc 
FROM 
    data 
INNER JOIN 
    constants 
    ON constants.constant_set_id = 1 
GROUP BY 
    data.name 

दोनों आप स्थिरांक के कई विभिन्न सेट डालते हैं। एक स्कीमा को बदले बिना विस्तार योग्य है, हालांकि क्वेरी को अभी भी बदलने की आवश्यकता होगी।

किसी भी दृष्टिकोण का मुख्य लाभ यह है कि आप स्थिरांक को फिर से उपयोग कर सकते हैं, लेकिन उन्हें एक बार केंद्रीकृत स्थान में स्टोर कर सकते हैं। जो केवल तभी प्रासंगिक होता है जब स्थिरांक में मानों को अपडेट करने की आवश्यकता होती है। संकेत के माध्यम से पुनः प्रयोग करें।

+0

शानदार - धन्यवाद! 1NF उल्लंघन के लिए – Perplexed

1

फिलहाल, आपकी तालिका स्पष्ट रूप से First Normal Form का उल्लंघन करती है, क्योंकि एक फ़ील्ड एक रिकॉर्ड के लिए कई मान रख सकता है।

वहाँ कम से कम दो तरीके इस हल किया जा सकता है:

(1) यदि केवल मूल्यों है कि इस क्षेत्र में संग्रहित किया जा सकता पाँच क्वेरी में निर्दिष्ट हैं, यह समझ बनाने सकता है चरित्र क्षेत्र को बदलने के लिए पाँच पूर्णांक क्षेत्रों, निर्दिष्ट हालत के लिए प्रत्येक एक ध्वज के साथ - अर्थात्:

... 
Illustrated int, 
FrontPage int, 
BackPage int, 
EDLP int, 
SpecialPromo int, 
... 

(2) विभिन्न स्थितियों की एक किस्म संग्रहीत करने के लिए कर रहे हैं तो मैं स्थितियों के लिए एक लुकअप तालिका, और एक लिंक जोड़ने का सुझाव शर्तों और मूल तालिका के बीच तालिका - जैसे:

Conditions 
---------- 
Condition_id 
Description 

Link_Table 
---------- 
Table1_id 
Condition_id 
+0

+1। – onedaywhen

1

सबसे पहले, यह लगता है कि Table1 पहले सामान्य रूप (NFNF) नहीं है, क्योंकि यह आवश्यकता है कि में से प्रत्येक टपल कि उस विशेषता यानी की घोषित प्रकार है प्रत्येक विशेषता प्रकार के होने के लिए वास्तव में एक मूल्य है का उल्लंघन करती है S_Data में कई स्केलर प्रकार हैं। आपको अपडेट विसंगतियों का सामना करना पड़ेगा उदा। एक सेटिंग को हटाने में संभावित रूप से टेक्स्ट कंसटेनेशन के साथ UPDATE शामिल है। इस बात पर विचार करें कि एसक्यूएल में ऑपरेटरों नहीं हैं जो इस तरह के डेटा (यानी गैर-संबंधपरक) को बहुत अच्छी तरह से संभालते हैं।

दूसरा, आपकी आउटपुट तालिका उप-शीर्ष है क्योंकि यह एक ही प्रकार को कई कॉलम के रूप में देता है यानी यह एक रिपोर्ट की तरह दिखता है।

पर विचार करें कि SQL में काम की इकाई पंक्ति है:

CREATE TABLE Settings 
(
Setting VARCHAR(15) NOT NULL UNIQUE 
); 

INSERT INTO Settings VALUES ('Illustrated'), ('FrontPage'), ('BackPage'), 
          ('EDLP'), ('SpecialPromo'); 

CREATE TABLE Table1 
(
Name VARCHAR(20) NOT NULL, 
Setting VARCHAR(15) NOT NULL 
    REFERENCES Settings (Setting) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
UNIQUE (Name, Setting) 
); 
नहीं
संबंधित मुद्दे