【问题标题】:SQL Server - Where condition usageSQL Server - Where 条件使用
【发布时间】:2015-09-21 09:07:16
【问题描述】:

我想在下面的选择 sql 代码中添加条件。

select rtrim(ltrim(SUBSTRING(line,1,CHARINDEX('|',line) -1))) as drivename
      ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('|',line)+1,
      (CHARINDEX('%',line) -1)-CHARINDEX('|',line)) )) as Float)/1024,0) as 'capacity(GB)'
      ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
      (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0)as 'freespace(GB)'
from #output
where line like '[A-Z][:]%'
order by drivename

结果是;

drivename   capacity(GB)    freespace(GB) 
C:\            120                36 
D:\            100                 7

我想这样添加:'freespace(GB) > 10'

如何添加这个条件?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    使用 CTE 或子查询:

    ;WITH cte as
    (
    select rtrim(ltrim(SUBSTRING(line,1,CHARINDEX('|',line) -1))) as drivename
          ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('|',line)+1,
          (CHARINDEX('%',line) -1)-CHARINDEX('|',line)) )) as Float)/1024,0) as 'capacity(GB)'
          ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
          (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0)as 'freespace(GB)'
    from #output
    where line like '[A-Z][:]%'
    )
    SELECT *
    FROM cte
    WHERE [freespace(GB)] > 10
    order by drivename;
    

    第二个是不理解的经典例子Logical Query Processing

    【讨论】:

      【解决方案2】:
      select rtrim(ltrim(SUBSTRING(line,1,CHARINDEX('|',line) -1))) as drivename
            ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('|',line)+1,
            (CHARINDEX('%',line) -1)-CHARINDEX('|',line)) )) as Float)/1024,0) as 'capacity(GB)'
            ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
            (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0)as 'freespace(GB)'
      from #output
      where line like '[A-Z][:]%'
      AND round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
            (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0) > 10
      order by drivename
      

      如果您只想显示上述查询的 C:\ 信息。

      【讨论】:

      • @sezercan 尝试使用AND round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1, (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0) > 10,但你的代码会重复且丑陋
      • @Abhishek 你只使用了部分表达式,计算freesize有2行
      【解决方案3】:

      有多种方法可以做到这一点。Temp tableCTE 可能看起来相同,但请尝试从 here. 了解它们之间的区别

      使用临时表

      select * into ##t from 
          (select rtrim(ltrim(SUBSTRING(line,1,CHARINDEX('|',line) -1))) as drivename,
          round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('|',line)+1,
          (CHARINDEX('%',line) -1)-CHARINDEX('|',line)) )) as Float)/1024,0) as 'capacity(GB)',
          round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
          (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0)as 'freespace(GB)'
          from #output
          where line like '[A-Z][:]%') as T
      
      Select * from ##t where [freespace(GB)] > 10 order by drivename
      

      通过使用 CTE

      ;WITH cte as
      (
      select rtrim(ltrim(SUBSTRING(line,1,CHARINDEX('|',line) -1))) as drivename
            ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('|',line)+1,
            (CHARINDEX('%',line) -1)-CHARINDEX('|',line)) )) as Float)/1024,0) as 'capacity(GB)'
            ,round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
            (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0)as 'freespace(GB)'
      from #output
      where line like '[A-Z][:]%'
      )
      
      SELECT * FROM cte WHERE [freespace(GB)] > 10 order by drivename;
      

      直接在where子句中使用条件

      select rtrim(ltrim(SUBSTRING(line,1,CHARINDEX('|',line) -1))) as drivename,
      round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('|',line)+1,
      (CHARINDEX('%',line) -1)-CHARINDEX('|',line)) )) as Float)/1024,0) as 'capacity(GB)',
      round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
      (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0)as 'freespace(GB)'
      from #output
      where line like '[A-Z][:]%'
      And (round(cast(rtrim(ltrim(SUBSTRING(line,CHARINDEX('%',line)+1,
      (CHARINDEX('*',line) -1)-CHARINDEX('%',line)) )) as Float) /1024 ,0)) > 10
      order by drivename
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 2021-02-03
        • 2018-11-26
        • 1970-01-01
        • 2013-09-08
        • 2014-06-05
        • 1970-01-01
        相关资源
        最近更新 更多