2017-10-08 105 views
-1

我在跟蹤電子組件的SQL Server數據庫中有許多表。因此,我有一個'值'介於0和10M之間的電阻器,以及一個介於1p和1u之間'值'的電容器。在SQL中處理SI前綴

我想對這些值執行簡單的數學運算,但必須先考慮SI前綴。

有關如何完全可以在SQL內完成的任何建議?大多數相關的問題似乎都使用python等來完成數據庫外部的工作。這不是我的情況。

編輯:要求提供進一步信息

我具有由工程師填充「值」字段中,並且因此它們被存儲爲varchar,在格式如3n3,2.2K,1M,等等有可能是一個小數點,或SI前綴作爲小數點。 這個數據的主要目的是在原理圖上顯示,因此這個醜陋的人類可讀的格式。 我的問題是關於如何將人類可讀的值解釋爲科學記數法(或統一規模),以便他們的數字解釋可以用於SQL服務器內部的計算。

+9

幫助我們幫助您 - 請分享你的表結構,一些示例數據,你正在試圖獲得該樣品 – Mureinik

+2

只要給每個表隱式SI單位的結果。 –

+0

只是爲了澄清:SI字首是值的一部分,例如「1u」或存儲在單獨的列中。我想了解你的問題是否是關於解析值的? – Alex

回答

2

您的情況確實需要更好的描述。

但是從基礎開始,您需要選擇1個單位作爲數據庫的基本單位。 (好,所以1個電阻器單位,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 

enter image description here

2

無論如何,這需要前綴關閉;您可能希望將它們相互相乘,在這種情況下,您需要用數字表示的「大數」乘以前綴所代表的數字。如果是的話,讓我知道,因爲這是可行的。如果你打算每個數字單獨做數學,我認爲這會令人滿意。

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 
+0

我認爲以上這些雖然可能需要根據案例的具體情況進行調整,但它們幾乎可以說明您的前進之路。 – SimonB