2016-09-21 36 views
1

我有一個名爲bundle_metadata的表,其中包含兩列「名稱」和「值」。我希望值列包含各種數據類型,具體取決於存儲的元數據類型。由於缺乏更好的解決方案,我通過將其存儲爲varchar來解決此問題。在同一調用中投射列爲不同類型

因此,例如一行可能是name: 'Price', value: '1000'和另一行:name: 'Category', value: 'Home'和第三個name: 'LocationLat', value: '55.15813'

現在的問題:

select語句然後可以是:

SELECT * FROM [bundle_metadata] WHERE (name='Price' AND value BETWEEN 200 AND 3000) OR (name='Category' AND value = 'Home') 

呼叫的兩個作品本身,但是當像上述組合,我得到這個錯誤:

Conversion failed when converting the nvarchar value '55.158313' to data type int. 

注意:價值55.158313甚至不是從選定的行。我究竟做錯了什麼?

在此先感謝

+0

確定它是。您在where列中使用了'value'字段,並且mysql仍然試圖將所有這些值轉換爲'between'調用的整數,儘管當'name ='時它應該被短路評估排除在外價格'失敗。 –

+0

@MarcB這是如何工作,如果查詢本身正常工作,如下所示: 'SELECT * FROM [bundle_metadata] WHERE(name ='Price'AND value BETWEEN 200 and 3000)' 只有當它與查詢的後半部分。 – vocoder

回答

1

在MySQL: 使用條件 '列名> 0' 這僅返回數值

SELECT * FROM `[bundle_metadata]` WHERE (value> 0) AND (name='Price' AND cast(value AS DECIMAL(10,2)) BETWEEN 200 AND 3000) OR (name='Category' AND value = 'Home') 

在MS SQL: 使用ISNUMERIC()方法來獲得其中指定的列具有唯一的數值的行。

MS SQL查詢1:

SELECT * FROM [bundle_metadata] where (ISNUMERIC(value) =1 AND (name='Price' AND CONVERT(FLOAT,[value]) BETWEEN 200 AND 3000)) OR (name='Category' AND value = 'Home') 

MS SQL查詢2:

SELECT * INTO #temp FROM [bundle_metadata] where ISNUMERIC(value) =1 
SELECT * INTO #final FROM #temp WHERE (name='Price' AND CONVERT(FLOAT,[value]) BETWEEN 200 AND 3000)  
INSERT INTO #final SELECT * FROM bundle_metadata WHERE (name='Category' AND value = 'Home') 
SELECT * FROM #final 

這裏的解釋爲我的第二查詢 第1行:我存儲在臨時表中的#TEMP過濾行這[值]欄中只有數字數據。
第2行:再次通過where name ='Price'過濾#temp表,並通過將[value]列轉換爲float.then並存儲在#final表中來應用範圍過濾。
第3行:將符合條件的行從bundle_metadata插入到#final表中,其中(name ='Category'AND value ='Home')。 第4行:通過選擇#最終表格獲得預期結果

+0

雖然此代碼可能會回答問題,但提供有關此代碼爲何和/或如何回答問題的其他上下文可提高其長期價值。不鼓勵使用僅有代碼的答案。 – Ajean

+0

@Ajean抱歉,原因不明的代碼,現在我給解釋 – Balan

+0

上面的MSSQL查詢1完美工作。但: 如果我改變它轉換爲INT而不是浮動我得到了和以前一樣的錯誤。 (ISNUMERIC(value)= 1 AND(name ='Price'AND CONVERT(INT,[value])BETWEEN 200 AND 3000))或(name ='Category'AND value ='家') INT也是一個數值,所以爲什麼這不起作用?價格'200'和'3000'可以作爲整數,對不對? – vocoder

0

你想做的數字比較。在MySQL中,您可以使用靜默轉換來轉換它們:

SELECT * 
FROM [bundle_metadata] 
WHERE (name = 'Price' AND value + 0.0 BETWEEN 200 AND 3000) OR 
     (name = 'Category' AND value = 'Home') 

MySQL必須爲每行處理WHERE子句。所以,每一行都會被轉換。它決定轉換的正確類型是一個整數,並且浮點值未通過該測試。

+0

順便說一句,爲什麼它也不工作?我已經定義了名稱和值varchar(50)並得到此錯誤'算術溢出錯誤轉換爲數據類型數字的varchar。' – Susang

相關問題