iT邦幫忙

0

SQL語法,如何將文字欄位內的數字挑出作計算?

sql

請教各位大大:
Table中有一欄位記錄的是產品規格,內容為2.5*20*50,如何產生出計算欄位,其結果為2500,又如何產生出判斷欄位(值大於1000,則show“大“;小於1000,show“小“)

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
18
aqr199
iT邦新手 2 級 ‧ 2009-12-31 08:12:43
最佳解答

如果只是為了顯示, 不要在SQL語法上處理, 不如放到程式端做一個函數, 字串解析+型態轉型

bizpro iT邦大師 1 級 ‧ 2009-12-31 10:13:00 檢舉

+1
SQL中含有商業邏輯會增加系統耦合度, 不利於長期系統維護.

lcjan iT邦研究生 4 級 ‧ 2009-12-31 15:03:53 檢舉

就我寫程式與對Oracle的經驗,萬不得已,不要這樣存放資料。
如果可以,把資料拆成三個欄位儲存。

可是,現在探討資料儲存架構可能為時已晚,
因此贊同aqr199說的,由你的AP來處理拆解與運算,你比較能夠掌握意外狀況。

感謝你的回答

10
Albert
iT邦高手 1 級 ‧ 2009-12-30 18:41:47

www.adempiere.org
http://www.adempiere.com/index.php/Taiwan

Oracle Database PL/SQL/Adempiere ERP 技術轉移顧問

歡迎使用 Oracle Database

可支持你任何企業需求

Skype::Adempiere/Compiere

你需要一流資料庫需要一流顧問

來成就你一流職場競爭力

CREATE FUNCTION StrCal (str VARCHAR2)
RETURN VARCHAR2
AS
dyn_stmt VARCHAR2(200);
n1 NUMBER;
b1 BOOLEAN;
BEGIN
dyn_stmt := 'SELECT '|| str || ' FROM DUAL';

EXECUTE IMMEDIATE dyn_stmt INTO n1;

IF n1 > 1000 THEN
RETURN '大';
ELSE
RETURN '小';
END IF;
END;

CREATE TABLE T_1(F_1 VARCHAR2(40));

INSERT INTO T_1(F_1)VALUES('2.5*20*50');

SELECT * FROM T_1;

SELECT F_1, StrCal(F_1) FROM T_1;
::
答案是 :: 2.5*20*50 大

看更多先前的回應...收起先前的回應...
Albert iT邦高手 1 級 ‧ 2009-12-30 18:43:41 檢舉

www.adempiere.org
http://www.adempiere.com/index.php/Taiwan

Oracle Database PL/SQL/Adempiere ERP 技術轉移顧問

歡迎使用 Oracle Database

可支持你任何企業需求

Skype::Adempiere/Compiere

你需要一流資料庫

更需要一流顧問

來成就你一流職場競爭力

哇, 第一次看到用 SELECT FROM DUAL 來算算數(學藝不精,慚愧慚愧)
今天真是又學到一招
賺到了 ^_^

Albert iT邦高手 1 級 ‧ 2009-12-31 13:05:24 檢舉

欄位打長寬高 是一個好主意 比打 總體積 總面積 好多了
你的好主意
需要好技術來支持
請支持一流資料庫 oralce/postgresql :: anti-MS MSSQLServer
請支持一流開發平台 java/android :: anti-MS .dotNet

Albert iT邦高手 1 級 ‧ 2009-12-31 18:08:32 檢舉

SQL中含有商業邏輯會增加系統耦合度, 不利於長期系統維護.
系統最好不要拿來企業用, 就不會有商業邏輯!!!
系統輸入畫面 本來就是 消耗品 給規格 驗收 要修改再發包!!
系統查詢畫面 本來就是 消耗品 給規格 驗收 要修改再發包!!
系統查詢報表 本來就是 消耗品 給規格 驗收 要修改再發包!!
一個查詢畫面才 1000元 + 10元 * 欄位數 =
一個輸入畫面才 1000元 + 10元 * 欄位數 =
一個查詢報表才 1000元 + 10元 * 欄位數 =
訂好介面 不被軟體開發商綁架 !!!
長期系統維護 !!! ??? 規格清楚 AnyWhere AnyTime 簡單維護!!!

Albert iT邦高手 1 級 ‧ 2009-12-31 18:12:29 檢舉

簡直是顛覆新奇的答覆::
問你溺水要如何救
一堆人回答不准下水就不會溺水
.....

Albert iT邦高手 1 級 ‧ 2009-12-31 18:24:59 檢舉

有誰不知道抽了比較簡單!!
就是沒有拆才問你如何判斷!!
讀研究所,父母親失業沒錢給租屋怎麼辦!!
不要讀就解決了!!!!!

感謝各位大大的回答

Albert iT邦高手 1 級 ‧ 2010-01-06 15:14:55 檢舉

簡直是顛覆新奇的答覆 :: 為最佳回答 ::
請問加油站在哪裡 ?? 最佳回答 :: 不要開車就不用加油:: 最佳回答

12
chan15
iT邦新手 2 級 ‧ 2009-12-31 03:59:56

感謝你的回答

10
igool
iT邦新手 4 級 ‧ 2010-01-04 10:34:51

如果你的表名为tb_student,需要查询的字段是professiona,语法如下:
select
case when first*second*three>1000
then '大'
when first*second*three<1000
then '小' end
from (
select substr(professional,0,instr(professional,'*',1)-1)
as first
,substr(professional,instr(professional,'*',1,1)+1,instr(professional,'*',1,2)-instr(professional,'*',1,1)-1)
as second
,substr(professional,instr(professional,'*',1,2)+1,length(professional))
as three
from tb_student u
)
以上你可以根据你实际的要求,进行替换。谢谢。

感謝你的回答,但執行時有錯,錯誤訊息“instr不是內建的函數“

我要發表回答

立即登入回答