Sql查询 - 摆脱硬编码值

时间:2012-01-11 15:48:34

标签: 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

我想要做的是将这些过滤器值存储在某种查找表或设置表中。

我正在努力研究如何从查询表中绘制值以用于此查询。

3 个答案:

答案 0 :(得分: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

两者都让你拥有多组不同的常量。一个是可扩展的,无需更改架构,但查询仍需要更改。

这两种方法的主要优点是您可以重复使用其他地方的常量,但将它们存储在一个集中位置。只有当/常量中的值需要更新时,才有意义。通过间接重用。

答案 1 :(得分:1)

目前,您的表格显然违反了First Normal Form,因为单个字段可以为单个记录保留多个值。

至少有两种方法可以解决这个问题:

(1)如果可以存储在该字段中的唯一值是查询中指定的五个值,则用五个整数字段替换字符字段可能是有意义的,每个字段都是指定条件的标志 - 即:< / p>

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

(2)如果要存储各种不同的条件,那么我建议为条件添加查找表,并在条件和原始表之间添加链接表 - 如下所示:

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

Link_Table
----------
Table1_id
Condition_id

答案 2 :(得分: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)
);