我在SQL Server中有一个名为tbl_spe
的表,其中包含CPU, RAM,...
等计算机的某些规范
我想选择具有这种条件的所有行:它们的RAM小于1GB的所有行
我们可以简单地写这个查询:
Select * from tbl_spe where RAM <= 1
或类似的东西,但问题是关于表的数据:
ID RAM
159 2GB DDR2
160 256MB DDR
161 3GB DDR2
162 512MB DDR
如何提取数字的RAM字段?并告诉查询选择他们的RAM小于1GB的所有行?
答案 0 :(得分:5)
;WITH CTE AS
(
SELECT *,
CONVERT(varchar(100), LEFT(RAM, PATINDEX('%[a-z]%', RAM) - 1)) AS RAMValue,
RIGHT(CONVERT(varchar(100), LEFT(RAM, PATINDEX('%[ ]%', RAM) - 1)), 2) AS RAMFactor
FROM tbl
)
SELECT *
FROM CTE
WHERE RAMFactor = 'MB'
以下是SQLFiddle
中的示例如果您希望小于2GB,请将WHERE子句更改为:
WHERE RAMFactor = 'MB'
OR (RAMFactor = 'GB' AND RAMValue < 2)
第一次检查将获得以“MB”为单位测量的所有记录,因此小于“GB”。 第二次检查将获得以“GB”为单位测量并且值小于2的所有记录,因此“GB”值小于2GB。
答案 1 :(得分:4)
SELECT * FROM tbl_spe
WHERE CAST( SUBSTRING(RAM,0,PATINDEX('%[a-zA-Z]%',RAM)) AS INT ) <=1
PATINDEX('%[a-zA-Z]%',RAM)
找到第一个字母的位置,SUBSTRING函数从字符串中提取数字。
编辑: 下面的查询考虑了以MB和GB为单位的RAM。否则上面的查询错误地返回256MB Ram大于1GB
SELECT * FROM tbl_spe
WHERE
( CAST( SUBSTRING(RAM,0,PATINDEX('%[a-zA-Z]%',RAM)) AS INT ) <=1 AND
RAM like '%GB%' )
OR
( CAST( SUBSTRING(RAM,0,PATINDEX('%[a-zA-Z]%',RAM)) AS INT ) <=1000 AND
RAM like '%MB%' )
答案 2 :(得分:4)
我使用@ XN16查询获取RAM字段的值(大小)提取部分,并在CASE
子句中使用WHERE
条件根据给定的大小应用条件。
SELECT * FROM tbl_spe
WHERE 1 <=
CASE
WHEN CHARINDEX('MB',SUBSTRING(RAM, 1, CHARINDEX(' ', RAM) - 1)) > 0
THEN CAST(CONVERT(varchar(100), LEFT(RAM, PATINDEX('%[a-z]%', RAM) - 1)) AS FLOAT) * 0.001
WHEN CHARINDEX('GB',SUBSTRING(RAM, 1, CHARINDEX(' ', RAM) - 1)) > 0
THEN CAST(CONVERT(varchar(100), LEFT(RAM, PATINDEX('%[a-z]%', RAM) - 1)) AS FLOAT)
END
在上述CASE
条件下,您可以添加KB的大小写并添加逻辑以从给定大小的KB中获取GB .....
查看 SQLFIDDLE
答案 3 :(得分:1)
嗯,我遇到了同样的问题所以我为此创建了自己的功能(当然我从网上的朋友那里得到了一些帮助)这就是功能:
CREATE FUNCTION ExtractInteger(@String VARCHAR(2000))
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @Count INT
DECLARE @IntNumbers VARCHAR(1000)
SET @Count = 0
SET @IntNumbers = ''
WHILE @Count <= LEN(@String)
BEGIN
IF SUBSTRING(@String,@Count,1) >= '0'
AND SUBSTRING(@String,@Count,1) <= '9'
BEGIN
SET @IntNumbers = @IntNumbers + SUBSTRING(@String,@Count,1)
END
SET @Count = @Count + 1
END
RETURN @IntNumbers
END
GO
答案 4 :(得分:0)
SELECT *
FROM tbl_spe
WHERE RAM LIKE '[1-9]GB%'
OR RAM LIKE '___MB%'
答案 5 :(得分:0)
两个步骤:
1)运行自定义函数,只从RAM
列中提取数值。
CREATE Function [dbo].[RemoveNumericCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin
Declare @NumRange as varchar(50) = '%[0-9]%'
While PatIndex(@NumRange, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@NumRange, @Temp), 1, '')
Return @Temp
End
2)第二步,只需使用功能
WITH CTE
AS
(
SELECT *,
RemoveNumericCharacters(RAM) AS Nums
FROM tbl_spe
)
SELECT *
FROM CTE
WHERE Nums <= 1