Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中SI前缀的处理_Sql_Sql Server - Fatal编程技术网

SQL中SI前缀的处理

SQL中SI前缀的处理,sql,sql-server,Sql,Sql Server,我在SQL Server数据库中有许多表,用于跟踪电子元件 同样地,我有一个“值”在0到10M之间的电阻器和一个“值”在1p到1u之间的电容器 我想对这些值执行简单的数学运算,但必须首先考虑SI前缀 对于如何在SQL中完成这项工作,有什么建议吗?大多数相关问题似乎都使用python等来完成数据库外部的工作。这不是我的选择 编辑:请求提供进一步信息 我有工程师填充的“值”字段,因此它们存储为varchar,格式为3n3、2.2k、1M等。可能有小数点,或者SI前缀用作小数点。 这些数据的主要用途是

我在SQL Server数据库中有许多表,用于跟踪电子元件

同样地,我有一个“值”在0到10M之间的电阻器和一个“值”在1p到1u之间的电容器

我想对这些值执行简单的数学运算,但必须首先考虑SI前缀

对于如何在SQL中完成这项工作,有什么建议吗?大多数相关问题似乎都使用python等来完成数据库外部的工作。这不是我的选择

编辑:请求提供进一步信息

我有工程师填充的“值”字段,因此它们存储为varchar,格式为3n3、2.2k、1M等。可能有小数点,或者SI前缀用作小数点。 这些数据的主要用途是在原理图上显示,因此是难看的人类可读格式。
我的问题是如何将人类可读的值解释为科学符号或单位标度,以便它们的数字解释可用于SQL server内部的计算。

您的案例确实需要更好的描述

但从基础开始,您需要选择1个单元作为数据库的基本单元。好的,所以一个单位是电阻,一个单位是电容 将所有值存储在该基本单位中。 存储“外部世界”单元是一个单独的列

既然所有值都在同一个单位中,就可以对它们进行计算了。 当需要输出到外部世界时,使用查找表转换为所需的任何单位

因此:

    create table test.resistors(
    name nvarchar(1000)
    ,value int
    ,unit smallint
)
insert into test.resistors([name],[value],[unit])
values('2 milliOhms resistor',2,1)
insert into test.resistors([name],[value],[unit])
values('2000 Ohm resistor',2,3)
insert into test.resistors([Name],[value],[unit])
values('10 Meg resistor',10,4)


create table test.resistorUnits(
    code smallint identity(1,1)
    ,name nvarchar(60)
    ,Ohms float
)
insert into test.resistorUnits([name],[Ohms])
values('m',.0001)
insert into test.resistorUnits([name],[Ohms])
values('Ohms',1)
insert into test.resistorUnits([name],[Ohms])
values('k',1000)
insert into test.resistorUnits([name],[Ohms])
values('M',1000000)

select 
    R.name,  R.value * U.Ohms as [Value in Ohms], cast(R.value as nvarchar) + ' ' + U.name as [Original Value]
from test.resistors R inner join test.resistorUnits U
        on R.unit = U.code

无论如何,这会去掉前缀;您可能希望将这些数字相乘,在这种情况下,您需要将数字乘以前缀表示的数字来表示“大数字”。如果是,请让我知道,因为这是可行的。如果你打算单独用每个数字做数学题,我想这会令人满意的

CREATE TABLE Component_Values
(
ID INT IDENTITY(11,1),
[value] nvarchar(11)
)
INSERT INTO Component_Values VALUES ('815.048u')
INSERT INTO Component_Values VALUES ('90.3m')
INSERT INTO Component_Values VALUES ('3659.88105d')
INSERT INTO Component_Values VALUES ('260.976da')
INSERT INTO Component_Values VALUES (651.8098)
INSERT INTO Component_Values VALUES ('88.917Y')
INSERT INTO Component_Values VALUES ('54.8673p')
INSERT INTO Component_Values VALUES ('75.256G')
INSERT INTO Component_Values VALUES ('121.9183T')
INSERT INTO Component_Values VALUES ('88.657y')
INSERT INTO Component_Values VALUES ('0.001Z')
INSERT INTO Component_Values VALUES ('86E')
INSERT INTO Component_Values VALUES ('8878.99P')
INSERT INTO Component_Values VALUES ('2.3758z')
INSERT INTO Component_Values VALUES ('9899.22a')
INSERT INTO Component_Values VALUES ('4578.999f')
INSERT INTO Component_Values VALUES ('766n')
INSERT INTO Component_Values VALUES ('8.021c')
INSERT INTO Component_Values VALUES ('7644.0984h')
INSERT INTO Component_Values VALUES ('8787.223k')
INSERT INTO Component_Values VALUES ('7M')

CREATE TABLE #Number
(
ID INT,
[Number] Float
)
INSERT INTO #Number
SELECT
ID, 
CASE WHEN RIGHT([value],2) NOT LIKE '[a-z][a-z]' AND RIGHT([value],1)
                           NOT LIKE '[0-9]' 
                           THEN (left([value],len([value])-1))
     WHEN RIGHT([value],2) LIKE '[a-z][a-z]' 
                           THEN (left([value],len([value])-2))
     ELSE [VALUE]
 END
 FROM Component_Values

 SELECT * FROM #Number

帮助我们帮助您-请共享您的表结构、一些示例数据以及您试图获得的此示例结果。只需为每个表提供一个隐含的SI单位。只是澄清一下:SI前缀是值的一部分,例如1u还是存储在单独的列中。我想知道你的问题是否与解析值有关?@Mureinik,对不起,我没有提供任何数据,因为我认为这与问题无关。我不是在寻找一个完整的工作答案,只是关于如何处理将国际单位制转换为数字的建议。@TimBiegeleisen,我认为这将是最直接的选择。我认为上述内容,虽然可能需要根据您的具体情况进行调整,但基本上说明了您的前进道路。