none
請教型別轉換的問題

    一般討論

  • exam3裡面主要記錄員工每年度的各項檢驗結果

    語法中會用到的欄位說明如下:

    code_f:檢驗單號
    idno1:病歷號
    date:檢驗日期
    const:檢驗項目
    fina:檢驗結果


    patient為員工資料表
    pat_code:病歷號
    class:員工職等

    以上欄位型態皆為nvarchar。

    我的目的是找出某段區間(2014-08-25~2014-12-31)的員工血壓有異常的。
    所以條件是 收縮壓 >= 180 或是 舒張壓 >= 110。

    我所遇到的問題是,假如我只使用一個條件,例如只用收縮壓,把舒張壓的語法拿掉,是可以查出資料。

    或把收縮壓的條件拿掉,只查詢舒張壓,也是正常。

    但是當兩個條件放在一起,會出現"將資料類型從 nvarchar 轉換到 real 時發生錯誤。"

    這是為甚麼呢?

    語法如下:

    SELECT t1.code_f, t1.idno1, t1.date, t1.fina
    FROM exam3 t1
    LEFT JOIN patient t2 
    	ON t1.idno1 = t2.pat_code 
    WHERE (t1.DATE BETWEEN '20140825' AND '20141231')
    	AND t2.class >= '1'
    	AND (
    		( 
    			t1.const = '血壓(收縮壓)' 
    				AND CAST(t1.fina AS FLOAT(1))  >= 180
    		) OR (
    			t1.const = '血壓(舒張壓)'
    				AND CAST(t1.fina AS FLOAT(1))  >= 90
    		)
    	)





    • 已編輯 ltgdtt 2014年10月27日 上午 01:31 補充schame
    • 已變更類型 ricoismeMVP, Moderator 2014年11月1日 上午 01:46 提問者後續未回覆
    2014年10月24日 上午 06:58

所有回覆

  • 或許您可以檢查一下fina資料行中是否有無法轉型成為Float的資料。

    http://technet.microsoft.com/zh-tw/library/ms191530(v=sql.105).aspx

    建議資料行的型態依照實際儲存內容來選擇,避免所有資料行的資料型態都用nvarchar或varchar,也可以減少不必要的空間浪費以及轉型所需要額外耗費的效能。


    以上說明若有錯誤請指教,謝謝。

    | 台灣 SQL PASS 社群 | SQL PASS Taiwan

    | 歡迎參觀我的BLOG - 積沙成塔

    2014年10月24日 上午 07:32
    版主
  • fina本身是用來儲存檢驗結果,上百種檢驗項目,不是每種項目的結果都會是數字。

    另外因為檢驗系統是別家的,所以他們只願意照他們原本的schema轉資料給我。我無法變更schema。

    針對我要的兩種血壓數值,我把資料全部都瀏覽過了,沒有非數字的資料存在。

    假如真有無法轉型的資料存在,為什麼我針對單一條件查詢時可以查出資料?

    2014年10月24日 上午 07:40
  • That column may have hidden character, you can test it with isnumeric function like 'isnumeric(fina) = 1' in where clause. And I'll avoid floating type in CAST in this case.
    2014年10月24日 下午 01:14
  • 這曾經試過,也是一樣。

    AND CAST(t1.fina AS FLOAT(1))  >= 180
    改寫成
    AND 
    CASE WHEN ISNUMERIC(t1.fina) = 1 THEN CAST(t1.fina AS FLOAT(1)) ELSE NULL END >= 180
    舒張壓的部分也一樣改寫。

    但是結果還是一樣,只看收縮壓或只看舒張壓,都會有資料。但兩個條件一起查詢時,一樣出現"將資料類型從 nvarchar 轉換到 real 時發生錯誤。"


    • 已編輯 ltgdtt 2014年10月24日 下午 02:54
    2014年10月24日 下午 02:53
  • App stores both blood pressures in same column? How do you know which is which? Where does t1.const come from?
    2014年10月24日 下午 04:00
  • 前面忘了說明const存的是檢驗項目名稱。

    那fina是檢驗結果。所以不論做哪種檢驗,結果值一律存在fina這個欄位裡。

    2014年10月25日 上午 03:37
  • 抱歉。
    其實問題沒解決
    2016年2月25日 上午 07:32
  • 假如改用union all 來執行呢?

    SELECT t1.code_f, t1.idno1, t1.date, t1.fina FROM exam3 t1 LEFT JOIN patient t2 ON t1.idno1 = t2.pat_code WHERE (t1.DATE BETWEEN '20140825' AND '20141231') AND t2.class >= '1' AND t1.const = '血壓(收縮壓)' AND CAST(t1.fina AS FLOAT(1)) >= 180

    union all

    SELECT t1.code_f, t1.idno1, t1.date, t1.fina
    FROM exam3 t1
    LEFT JOIN patient t2 
    	ON t1.idno1 = t2.pat_code 
    WHERE (t1.DATE BETWEEN '20140825' AND '20141231')
    	AND t2.class >= '1'
    	AND t1.const = '血壓(舒張壓)'
    	AND CAST(t1.fina AS FLOAT(1))  >= 90

    2016年5月17日 上午 12:31