我有一张这样的桌子
productId Inventory
--------------------
1 1
2 Ab
3 12.5
4 6
6 2
如何选择库存为int
和其他值为零,在Inventory
哪里varchar
?
我有一张这样的桌子
productId Inventory
--------------------
1 1
2 Ab
3 12.5
4 6
6 2
如何选择库存为int
和其他值为零,在Inventory
哪里varchar
?
假设这是 SQL Server,那么您可以这样做:
SELECT productid,
CAST((CASE isnumeric(inventory)
WHEN 0 THEN 0
ELSE CAST(Inventory AS DECIMAL(10, 2))
END) AS INT) AS Inventory
FROM tablename
这会给你:
| PRODUCTID | INVENTORY |
-------------------------
| 1 | 1 |
| 2 | 0 |
| 3 | 12 |
| 4 | 6 |
| 6 | 2 |
如果您希望像 12.5 这样的十进制值以整数而不是小数的形式出现,则必须执行以下操作来修剪小数位:
select case when isNumeric(Inventory) = 1 then cast(cast(Inventory as DECIMAL(10,0)) as INT) else 0 end as Inventory_INT, productId
from PRODUCTS
select case when isnumeric(inventory) then
cast(inventory as INT)
else
0
end
你使用起来更安全PatIndex()
。IsNumeric不是在 sql-server 中检查数值的最佳方法,因为它也会为货币符号返回 1(例如,isnumerc('$')
等于1)msdn。
以下示例不四舍五入十进制值。如果您需要向上取整值,则将库存转换为小数。Sql-Demo使用Patindex()
函数。
select productId, case patindex('%[0-9]%',inventory)
when 1 then convert(int,convert(decimal(10,2),inventory))
else 0 end inventory
from T
| PRODUCTID | INVENTORY |
-------------------------
| 1 | 1 |
| 2 | 0 |
| 3 | 12 |--NOTE
| 4 | 6 |
| 6 | 2 |
| 7 | 0 |--Extra data row added with '$'
从库存中获取四舍五入的值;
select productId, case patindex('%[0-9]%',inventory)
when 1 then convert(decimal,inventory)
else 0 end inventory
from T
| PRODUCTID | INVENTORY |
-------------------------
| 1 | 1 |
| 2 | 0 |
| 3 | 13 |--NOTE
| 4 | 6 |
| 6 | 2 |
| 7 | 0 |--Extra data row added with '$'