5

tbl_speこの条件ですべての行を選択したいなど、コンピューターのいくつかの仕様を含むSQL Server と呼ばれるテーブルがあります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未満のすべての行を選択するようにクエリするように指示しますか?

4

6 に答える 6

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」未満になります。2 番目のチェックでは、「GB」で測定され、値が 2 未満のすべてのレコードが取得されます。したがって、「GB」の値は 2GB 未満です。

于 2013-04-30T07:37:10.427 に答える
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をチェックしてください

于 2013-04-30T08:30:19.633 に答える