我有一个名为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}}甚至不是所选行。我做错了什么?
提前致谢
答案 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
子句。因此,每一行都将接触转换。它确定转换的正确类型是整数,并且浮点值未通过该测试。