2012-01-11 24 views
5

Aşağıdaki sorgu var:SQL sorgusu - kodlanmış değerlerin kurtulmak

arama tablosu çeşit veya bir ayarlar tabloda bu filtre değerlerini saklamaktır Ne yapmak istiyorum
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 

.

Bu sorgu ile kullanılacak bir arama tablosundaki değerleri nasıl çizileceği ile uğraşıyorum.

+6

değil kazanmak istiyorum ne kadar emin, ben hala '(Illustrated' kodlanmış sütun adlarını istediğimiz farz ediyorum beri, Sonuç kümenizdeki bu değerlerle ilişkilendirilmiş 'FrontPage' vb. –

+0

Bu seçim için görünüm oluşturmaya ne dersin? –

+0

Düşündüğüm şey, yani "buna değer mi?" – Perplexed

cevap

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 

Ben en az iki seçenekten düşünebiliriz

... Ya da ...

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 

ikisi de sabitleri birden fazla farklı setleri atalım. Biri, şemayı değiştirmeden genişletilebilir, ancak sorgunun değişmesi gerekmesine rağmen.

Her iki yaklaşımın en önemli avantajı, sabitleri başka yerlerde yeniden kullanabilmeniz, ancak bunları bir kez merkezi bir konumda depolayabilmenizdir. Hangi sadece sabitlerin değerleri güncellenmesi gerektiğinde/ile ilgili. Dolaylı olarak yeniden kullanın.

+0

Parlak - teşekkürler! 1NF ihlali için – Perplexed

1

Şu anda, tablonuz First Normal Form değerini ihlal ediyor, çünkü tek bir alan tek bir kayıt için birçok değeri tutabiliyor.

Orada bu çözülebileceğini en az iki yolu vardır:

(1) Bu alanda saklanabilir yalnızca değerler sorguda belirtilen beşini ise, o karakter alanını değiştirmek için mantıklı olabilir beş tamsayı alanları, belirtilen koşul için her bir bayrak ile - yani:

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

(2) farklı koşullar çeşitli saklanacak ise, o zaman koşullar için bir arama tablosu ve bir bağlantı ekleyerek öneririm koşullar ve orijinal tablo arasındaki tablo - gibi:

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

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

+1. – onedaywhen

1

Önce her tanımlama grubu yani o özelliğin beyan türüdür tipte olduğu her özellik için tam bir değere sahiptir şartı ihlal ettiğinden, Table1 önce normal formu (NFNF) olmadığını görünür S_Data'un birden çok skaler tipi vardır. Güncelleme anormalliği yaşayacaksınız. Bir ayarın silinmesi muhtemelen metin birleştirme ile bir UPDATE içerir. SQL'in bu tür verileri (yani ilişkisel olmayan) çok iyi işleyen operatörlere sahip olmadığını düşünün.

İkincisi, çıktı tablonuzun alt sınırı, birden çok sütunla aynı türü döndürmesidir, yani daha çok bir rapora benziyor.

SQL işin birim satırı olduğuna dikkat düşünün:

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) 
);