如何将代码值转换为人类可读的值?

时间:2014-07-08 04:04:39

标签: mysql database-design

我的应用程序很多列都是由机器友好的代码填充的。例如,status列可能有20个状态代码,例如fc值代替FinishedCurrent。从db获取时,如何将此代码轻松转换为自然对应的代码?

我想为每个表创建一个视图,在视图中我需要每个代码列的自然列table.status - > view.statusText

更新

目前,我将自然值存储在下表中,并使用此表连接每个表。

CREATE TABLE `constant` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `text` CHAR(255) NULL DEFAULT NULL COLLATE ,
    `value` VARCHAR(50) NULL DEFAULT NULL COLLATE ,
    `category` VARCHAR(255) NULL DEFAULT NULL COLLATE ,
    PRIMARY KEY (`id`)
)

以下是此类视图的示例。

SELECT program.*,ct.text AS typeText,cs.text as subjectText, count(programId) as enrollerCount,e.fullName as entityFullName, 
if(now()>enrollmentEndDate,'a',if(now()<enrollmentStartDate,'b','c') ) as enrollmentStatus ,
if(now()>executionEndDate,'a',if(now()<executionStartDate,'b','c') ) as executionStatus,
ts.text as executionStatusText
FROM program
left join enroller on program.id=programId
LEFT JOIN constant ct ON `type`=ct.value
left join constant cs on `subject`=cs.value 
left join entitylist e on e.id=program.entityId
left join constant ts on if(now()>executionEndDate,'a',if(now()<executionStartDate,'b','c') )=ts.value and ts.category='timeStage'
WHERE (ct.category='programType' OR ct.category IS NULL)
and (cs.category='subject' OR cs.category IS NULL)
group by program.id 

有没有办法让视图更清洁,更易于维护?

3 个答案:

答案 0 :(得分:2)

您可以这样做:

SELECT CASE 
         WHEN status='f' THEN 'Finished'
         WHEN status='c' THEN 'Current'
       END AS status
...

答案 1 :(得分:2)

最常见的是,您会有一个查找表,提供友好的代码版本。如果你的主表是

CREATE TABLE Main
(
    Id    INT,
    Code  CHAR(1)
);

你可以有一个查找表

CREATE TABLE Lookup
(
    Code CHAR(1),
    English VARCHAR(50) -- for example
);

然后你可以

SELECT * FROM Main m INNER JOIN Lookup l ON l.Code = m.Code

SQL语法是SQL Server,但对于MySQL应该是相同或非常接近的。

<强>更新

您可以根据上述联接创建视图以简化编码

我认为MySQL语法类似于

CREATE VIEW MyView AS SELECT * FROM Main m INNER JOIN Lookup l ON l.Code = m.Code

然后你可以

SELECT English FROM MyView WHERE Id=42 -- Or however you are selecting your rows

http://dev.mysql.com/doc/refman/5.7/en/create-view.html

答案 2 :(得分:0)

我能想到的唯一建议是架构中的另一个表。一个category表。

CREATE TABLE Category(
categoryID    INT IDENTITY(1,1) NOT NULL,
categoryType  VARCHAR(6),
categoryCD    VARCHAR(12),
categoryDesc  VARCHAR(255),
createdDate   DATETIME DEFAULT (GETDATE())
);

沿着这些方向的东西,其中categoryType是类别的类型(可能有多个具有相似机器可读代码的类别)categoryCd是代码(例如&#39; f&#39;或&#39; c&#39; )和categoryDe​​sc是人类描述。当然,这种方法会让你在查询中点击另一个表来获取人类可读的代码。

所以快速举例

categoryID: 1
categoryType: "ORDER"
categoryCD: "C"
categoryDesc: "Cancelled"

categoryID: 2
categoryType: "ORDER"
categoryCD: "F"
categoryDesc: "Finished"

categoryID:3
categoryType: "QUOTE"
categoryCD: "C"
categoryDesc: "Completed"

您可以使用类别类型

将表格链接到类别表格
SELECT G.categoryDesc FROM table A, category G
WHERE G.categoryType = 'ORDER' AND G.categoryCD = A.categoryCD

希望有帮助吗?