【发布时间】:2012-01-25 12:13:19
【问题描述】:
我有一个文本文件,我每个月都会解析它并将数据插入到我的数据库中。文本文件如下所示。
---------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------- 黑。没有 410 | 1 2| 3 4 5 6 7 | 8 9| 10 11 12 13 14 |15 16| 17 18 19 20 21 |22 23| 24 25 26 27 28 |29 30| 31 1 2 黑 88.35 |萨苏| MO TU WE TH FR |SA SU| MO TU WE TH FR |SA SU| MO TU WE TH FR |SA SU| MO TU WE TH FR |SA SU|莫图我们 铬。 88.35 |194 / 159 | |194 / 159 | |194 / 159 | |194 / 159 | |239 关闭 14 : : VER DFW TRC DFW X : : VER DFW TRC DFW X : : VER DFW TRC DFW X : : VER DFW TRC DFW X : : CUU DFW C/O 06.00 TAFB 216.15 194=/1410/1055/0740, 159=/0900/1700/1400, 239=/1845/1945/0155 EM3 25.55 ERD 42.00 EM4 20.40 -------------------------------------------------- -------------------------------------------------- --------------------------这个文本文件有 100 到 300 条这样的记录(我们称之为“飞行路线”),我用它来确定我每个月的航班时刻表。我很好地解析了这个文件,但是公司又添了一个新问题。
这条“线路”可以是飞行员或空乘人员。直到最近,每条线路都可以用于船长或副驾驶。但现在有些档案有船长线和副驾驶线。空乘人员档案可能有 1 或 2 个或更多空乘职位,具体取决于所飞行的飞机类型。
我需要在我的数据库中创建一个反映这些新信息的新列。一旦这些行被保存到数据库中,它们只会被搜索,永远不会再次更新。我不想添加一个新表只是为了跟踪这些信息。我想在现有表中添加一个新列。这是我的策略。
当我解析文本文件时,我会跟踪可用的位置。如果是船长,我会将“CA”保存到数据库中。如果是副驾驶,我会保存“FO”。如果是船长和副驾驶,我会保存“CAFO”。对于空乘人员,我将为 1 个空乘人员位置保存一个数字“1”。对于每一个额外的位置,我只会增加一个数字。如果更大的飞机需要更多的空姐职位,这将允许以后扩展。
所以回顾一下,我将为每个数据库记录保存一个以下内容。
- “CAFO”
- “加拿大”
- “FO”
- “1”
- “2”
现在我需要访问数据库并为我的网络程序检索这些记录。如果船长想要检索记录,他将只需要船长行,即“CAFO”或“CA”。副驾驶则相反。 当我进行查询时,我发现我可以使用 mySQL 命令 SUBSTRING 来获取前 2 个或后 2 个字符。
船长线
SELECT
Line_number,html_textFROMlinesWHERE SUBSTRING(Crew_type,1,2)="CA"
这只会从记录中获取前两个开始字符,并且会匹配两种情况。 对于一级军官,我从字符串的末尾开始并抓取最后两个字符。
SELECT
Line_number,html_textFROMlinesWHERE SUBSTRING(Crew_type,-2)="FO"
对于空乘人员,我可以比较这个数字。 如果空乘人员只想要 1 个位置的线路。
SELECT
Line_number,html_textFROMlinesWHERE Crew_type = "1"
或者如果他们想要所有可能的空姐职位
SELECT
Line_number,html_textFROMlinesWHERE Crew_type >= "1"
我会使用上面列出的值将列类型设置为 ENUM。
我的问题是有更好的方法来解决这个问题吗?我只会插入一次,但会检索很多。 SUBSTRING 命令是否会过多地减慢查询速度?
【问题讨论】: