在同一个调用中将列转换为不同类型

时间:2016-09-21 15:05:18

标签: mysql sql casting

我有一个名为bundle_metadata的表,其中包含两列' name'和'价值'。我希望value列包含所有类型的数据类型,具体取决于存储的元数据类型。由于缺乏更好的解决方案,我将其存储为varchar。

例如,一行可以是name: 'Category', value: 'Home',另一行可以是name: 'LocationLat', value: '55.15813',第三行是SELECT * FROM [bundle_metadata] WHERE (name='Price' AND value BETWEEN 200 AND 3000) OR (name='Category' AND value = 'Home')

现在出现问题:

select语句可以是:

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

这两个调用都是自己工作的,但是当像上面那样组合时,我会收到这个错误:

55.158313

注意:值{{1}}甚至不是所选行。我做错了什么?

提前致谢

2 个答案:

答案 0 :(得分:1)

在MySQL中: 使用条件'column_name> 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中,该表只有[value]列中的数值数据 第2行:再次按名称='价格'过滤#temp表,并通过将[value]列转换为float.then应用范围过滤,存储在#final表中。
第3行:在bundle_metadata中将符合条件(name ='Category'AND value ='Home')的行插入到#final表中。 第4行:通过选择#final表

获得预期结果

答案 1 :(得分: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子句。因此,每一行都将接触转换。它确定转换的正确类型是整数,并且浮点值未通过该测试。