我有一个名为 bundle_metadata 的表,其中包含两列“名称”和“值”。我希望值列包含各种数据类型,具体取决于存储的元数据类型。由于缺乏更好的解决方案,我通过将其存储为 varchar 来解决这个问题。
例如,一行可以是 name: 'Price', value: '1000'
和另一个:name: 'Category', value: 'Home'
和第三个名称:'LocationLat',值:'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
不是来自所选行。我做错了什么?
提前致谢
最佳答案
在 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')
在微软 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 行:再次通过 where name ='Price' 过滤 #temp 表,并通过将 [value] 列转换为 float 来应用范围过滤。然后存储在#final 表中。
第 3 行:将 bundle_metadata 中满足条件 where (name='Category' AND value = 'Home') 的行插入#final 表。
第 4 行:通过选择#final table 获得预期结果
关于mysql - 在同一调用中将列转换为不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39620222/