假如某表中一个A字段里面的内容如下1P补差
1P补差
9P  补差
4P  补差
S5557  9/5
S5557  9/5
B1361补差 开-平-预-缝
B1361补差 开-平-预-缝
.
.
.
我希望查询得到的数据是
1
9
4
0
0
0
0
.
.
也就是说A字段里显示P前面的数字,如果没有P就显示0,请问这样的查询语句是否能实现呢?

解决方案 »

  1.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2011-03-24 11:29:41
    -- Verstion:
    --      Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
    -- Jul  9 2008 14:43:34 
    -- Copyright (c) 1988-2008 Microsoft Corporation
    -- Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([col] varchar(20))
    insert [tb]
    select '1P补差' union all
    select '1P补差' union all
    select '9P补差' union all
    select '4P补差' union all
    select 'S55579/5' union all
    select 'S55579/5' union all
    select 'B1361补差开-平-预-缝' union all
    select 'B1361补差开-平-预-缝'
    --------------开始查询--------------------------
    select
       case when CHARINDEX('p',col)>0 then LEFT(col,CHARINDEX('p',col)-1) else 0 end as col
    from
       tb
    ----------------结果----------------------------
    /* col
    -----------
    1
    1
    9
    4
    0
    0
    0
    0(8 行受影响)*/
      

  2.   

    select case when CHARINDEX('p',value)=0 then '0' else left(value,CHARINDEX('p',value)-1) end
    from tb
      

  3.   

    在将 nvarchar 值 'S5187----S5207    对大身' 转换成数据类型 int 时失败。出错了
      

  4.   


    这个语句的话就是取了P前面的数据了,但是万一P在中间的话就会想那样:
    最终结果                  原来字段
    6                6P
    32                32P 补差
    B1527补差   3        B1527补差   3P  新纱批号    重新复样
    B1527补差   3           B1527补差   3P  新纱批号    重新复样
    5                5P 色花  重投
    B1527补差   3        B1527补差    3P
      

  5.   


    --那就取 P 前面的 1个字符 substring(col,CHARINDEX('p',col)-1,1)
      

  6.   

    --> 测试数据:[TB]
    if object_id('[TB]') is not null drop table [TB]
    create table [TB]([col] varchar(20))
    insert [TB]
    select '1P补差' union all
    select '1P补差' union all
    select '9P补差' union all
    select '4P补差' union all
    select 'S55579/5' union all
    select 'S55579/5' union all
    select 'B1361补差开-平-预-缝' union all
    select 'B1361补差开-平-预-缝'select * from [TB]
    SELECT CASE  ISNUMERIC(LEFT(col,1)) WHEN 1 THEN LEFT(col,1) ELSE 0 END FROM TB/*
    1
    1
    9
    4
    0
    0
    0
    0*/
      

  7.   

    create table ls(mc varchar(100))insert ls 
    select '1P补差' union 
    select  '9P 补差'       union
    select  '4P 补差' union
    select  'S5557 9/5' union
    select  'B1361补差 开-平-预-缝'select case  CHARINDEX ('p',mc) when 0 then '0' else left(mc,CHARINDEX ('p',mc)-1) end as mc from  ls--SUBSTRING (<expression>, <starting_ position>, length) 
    --返回从字符串左边第starting_ position 个字符起length个字符的部分。--CHARINDEX (<’substring_expression’>, <expression>) 
    --返回字符串中某个指定的子串出现的开始位置