2012-01-11 70 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', 'FrontPage'等)与结果集中的值关联。 – 2012-01-11 15:51:46

+0

如何为这个选择创建一个视图? – 2012-01-11 15:53:37

+0

那就是我的想法 - 即“值得吗?” – Perplexed 2012-01-11 15:54:56

回答

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

辉煌 - 谢谢! – Perplexed 2012-01-11 18:01:33

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

1NF违规。 – onedaywhen 2012-01-12 10:02:56

1

首先,看起来Table1不是第一范式(NFNF),因为它违反了每个元组只有一个值为每个属性的属性的类型是该属性的声明类型的要求,即S_Data有多个标量类型。您将遭受更新异常,例如大概删除一个设置涉及UPDATE与文本串联。考虑到SQL没有非常好地处理这种数据(即非关系型)的操作符。

其次,您的输出表是次优的,因为它返回与多列相同的类型,即它看起来更像是一个报告。

考虑,在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) 
);