假设我有这个查询。
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
答案 0 :(得分:1)
假设你的字符串中有NNNN: xxxxxxxxxxx)
这样的模式,你可以使用charindex
和substring
对字符串值进行一些简单的操作来提取这个数字:
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