[英]SQL (lite) Value Mapping
我有一个简单的 SQL 表,显示名称(文本)和值(文本)。 该值可以是 int、float 和 string。 对于我的问题,在某些情况下,该值可以具有映射,而所有其他情况下,该值应按原样显示。 鉴于数据库将包含多个映射表,执行此操作的正确 SQL 方法是什么。
以下面的例子为例:
查询原始数据:
temp1 , 3.2 (As is)
temp2 , 20.0 (As is)
Valve , 0 (map 0 / 1 to close / open)
Engin3, 1 (map 0,1,2,3 -> running, idle, stopped, off)
Sysflag, A (As is)
查询 w 映射:
temp1, 3.2
temp2, 20.0
Valve, Closed
Engin1, Idle
SysFlag, A
谢谢
继续...
GMB,感谢您的反馈。 在我给出的有限示例中,我可以看到如何使用 case 查询处理映射是有意义的。 对于我的 IRL db,我认为制作映射表更合适。 我也喜欢小查询的想法,但速度是优先级 1(在嵌入式设备上运行)。 我的SQL知识水平低于定义干净的sql表关系和规则的水平,除非在映射表中定义了类型并且未定义值,否则值文本应显示“错误(值)”。
因此,对于我的简单数据库示例,请帮助理解您对映射表的最后建议以及我做错了什么:
CREATE TABLE IF NOT EXISTS devtbl(Name TEXT, Value TEXT);
INSERT INTO devtbl VALUES('temp1' , '3.2' );
INSERT INTO devtbl VALUES('temp2' , '20.0');
INSERT INTO devtbl VALUES('Valve1' , '0' );
INSERT INTO devtbl VALUES('Engin1' , '1' );
INSERT INTO devtbl VALUES('System' , 'A' );
CREATE TABLE IF NOT EXISTS mappingtbl(Name TEXT, Value TEXT, Mapped_Value TEXT);
INSERT INTO mappingtbl VALUES ('Valve1' ,'0','close' );
INSERT INTO mappingtbl VALUES ('Valve1' ,'1','open' );
INSERT INTO mappingtbl VALUES ('Engin1','0','running');
INSERT INTO mappingtbl VALUES ('Engin1','1','idle' );
INSERT INTO mappingtbl VALUES ('Engin1','2','stoppe');
INSERT INTO mappingtbl VALUES ('Engin1','3','off' );
在 sqlite3 的以下输出中运行查询结果
select devtbl.Name, coalesce(devtbl.Value, mappingtbl.Mapped_Value)
from devtbl left join mappingtbl
on mappingtbl.Name = devtbl.Name and mappingtbl.Value = devtbl.Value;
Name Value
--------------------------
temp1 3.2
temp2 20.0
Valve1 0
Engin1 1
System A
sqlite3 不支持某些东西,错误的想法或错误的查询?
想要的结果:
Name Value
--------------------------
temp1 3.2
temp2 20.0
Valve1 Close
Engin1 idle
System A
我推测在 devtbl 中有一个列引用映射表。 如果存在映射表引用,则使用mapped_value 否则显示devtbl 值。
开发表:
Name Value MappingRef
-------------------------------------
temp1 3.2
temp2 20.0
Valve1 0 ValveMap
Engin1 1 EnginMap
System A
阀门图:
Value map_value
-------------------------------------
0 close
1 open
引擎地图:
Value map_value
-------------------------------------
0 running
1 idle
2 stopped
3 off
此外,如果映射表中不存在该值,则显示错误。 这种情况下的 sq 查询是什么? 什么是最好、正确、干净和最快速的方法?
您可以在两级case
表达式中进行转码,如下所示:
select
name,
case name
when 'temp1' then value
when 'temp2' then value
when 'Valve'
then case value
when '0' then 'close'
when '1' then 'open'
end
when 'Engin1'
then case value
when '0' then 'running'
when '1' then 'idle'
when '2' then 'stopped'
when '3' then 'off'
end
when 'SysFlag' then value
end
from mytable
您可以按如下方式稍微缩短case
表达式:
case
when name in ('temp1', 'temp2', 'SysFlag') then value
when name = 'Valve'
then case value
when '0' then 'close'
when '1' then 'open'
end
when name = 'Engin1'
then case value
when '0' then 'running'
when '1' then 'idle'
when '2' then 'stopped'
when '3' then 'off'
end
end
真正简化此查询的一种方法是创建一个单独的表来存储映射,例如:
name value mapped_value
Valve 0 close
Valve 1 open
Engin1 0 running
Engin1 1 idle
Engin1 2 stopped
Engin1 3 off
然后,您可以在查询中left join
映射表:
select t.name, coalesce(m.vaue, t.mapped_value)
from mytable t
left join mapping_table m on m.name = t.name and m.value = t.value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.