如何在SQL Server中使用子字符串

时间:2016-01-20 08:38:47

标签: sql sql-server tsql

假设我有这个查询。

SELECT 
    proj.refno [Reference No.], 
    proj.projname [NNNN], 
    TotalCost= '$' + CONVERT(NVARCHAR(100),cast(ROUND((cast(ship.volfinish as int) * data.price)/1000,2) as decimal(5,2)))
 FROM 
     projects proj
 INNER JOIN 
     projdata data ON proj.controlno = data.controlno 
 INNER JOIN 
     shipment ship ON data.ctrlno = ship.dctrlno 
 WHERE 
     proj.refno IN ('item1', 'item2','item3') 
 ORDER BY 
     proj.refno

使用此输出:

    Reference No.           NNNN                                                TotalCost
GR-NFS52  abc123             StudentsTitle123 (NNNN: xxxxxxxxxxxxx)                                $215.45
GR-PFS53  def456             StudentsTitle456 (NNNN: xxxxxxxxxxxxx)                                $259.55
GR-SSFS43   ghi789         StudentsTitle789 (NNNN: xxxxxxxxxxxxx)                           $242.35

如何使NNNN列使用此输出的子字符串函数。因为我没有进入t-sql。

NNNN
xxxxxxxxxxxxx
xxxxxxxxxxxxx
xxxxxxxxxxxxx

2 个答案:

答案 0 :(得分:1)

假设你的字符串中有NNNN: xxxxxxxxxxx)这样的模式,你可以使用charindexsubstring对字符串值进行一些简单的操作来提取这个数字:

declare @str nvarchar(max)
select @str = 'Students (NNNN: 9781410314291)'

select substring(@str, 
               charindex('ISBN:', @str) + 6, 
               charindex(')', @str, charindex('NNNN:', @str)) - charindex('NNNN:', @str) - 6)

这里我们首先找到NNNN:子串的位置,然后在这个放样之后找到关闭括号)的第一次出现的位置,并在这些位置之间取一部分字符串 - 这正是你需要的数字。

在您的特定情况下,您可以在select查询中使用outer apply,以避免多次复制粘贴相同的charindex('NNNN:', proj.projname)表达式,从而使其更具可读性:

select
    proj.refno [Reference No.], 
    substring(proj.projname, 
             CALC.pos_from, 
             charindex(')', proj.projname, CALC.pos_from) - CALC.pos_from - 6) as [NNNN],
    ....
FROM projects proj
  .....
   outer apply (select charindex('NNNN:', proj.projname) as pos_from) as CALC

答案 1 :(得分:1)

试试这个:

DECLARE @str nvarchar(max) = 'Novels for Students, vol. 52 (ISBN: 9781410314291)'

SELECT 
  REPLACE(STUFF(@str, 1, PATINDEX('% '+REPLICATE('[0-9]', 13) + '%', @str), ''), ')', '')

结果:

9781410314291