我的应用程序很多列都是由机器友好的代码填充的。例如,status
列可能有20个状态代码,例如f
和c
值代替Finished
和Current
。从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
有没有办法让视图更清洁,更易于维护?
答案 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
答案 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; )和categoryDesc是人类描述。当然,这种方法会让你在查询中点击另一个表来获取人类可读的代码。
所以快速举例
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
希望有帮助吗?