从此表中选择

时间:2013-04-30 07:27:28

标签: sql tsql

我在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的所有行?

6 个答案:

答案 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