繁体   English   中英

SQL(精简版)值映射

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM