在SQL中某些子字符串之后仅选择数字

我有多行包含一个具有不同值的字符串,其中一些具有数字,例如:

XARELTO 20 MG 14 COM.(A)(P)85003(SC)(SF)

我需要获取字符串上的数字,但只有“(P)”之后的数字才可以获取:

85003

忽略(P)之前和之后的所有字符85003

例如,以下是一些行:

| ProductName                                  |
+----------------------------------------------+
| VALCOTE 125 MG 30 CAP.(P)15188(SC)(SF)       |
+----------------------------------------------+
| ALPHAGAN SOL. OFT. 5 ML (A)(P)19347(SC)      |
+----------------------------------------------+
| LUMIGAN 0.03% OF.3ML(A)(P)67740(SC)(3%+)     |
+----------------------------------------------+
| BetaLOC ZOK 50 MG 30 TBS (P)15390            |
+----------------------------------------------+
| CASODEX 50 MGS 28 TBS (E)(P)104334(SC)       |
+----------------------------------------------+
| SEROQUEL 100 MG 30 TBS(E)(A)(P)55800         |
+----------------------------------------------+
| SEROQUEL 200 MG 30 TBS (E)(A)(P)111600       |
+----------------------------------------------+
| SEROQUEL 25 MG 30 TBS (A)(P)13950            |
+----------------------------------------------+

这是我在SELECT语句之后需要的:

| ProductPrice                                 |
+----------------------------------------------+
| 15188                                        |
+----------------------------------------------+
| 19347                                        |
+----------------------------------------------+
| 67740                                        |
+----------------------------------------------+
| 15390                                        |
+----------------------------------------------+
| 104334                                       |
+----------------------------------------------+
| 55800                                        |
+----------------------------------------------+
| 111600                                       |
+----------------------------------------------+
| 13950                                        |
+----------------------------------------------+
qq378755837 回答:在SQL中某些子字符串之后仅选择数字

这不是很漂亮,但是可以。但是,这并不假定所有值都将包含5个字符:

WITH VTE AS(
    SELECT *
    FROM (VALUES('VALCOTE 125 MG 30 CAP.(P)15188(SC)(SF)  '),('ALPHAGAN SOL. OFT. 5 ML (A)(P)19347(SC) '),('LUMIGAN 0.03% OF.3ML(A)(P)67740(SC)(3%+)'),('BETALOC ZOK 50 MG 30 TBS (P)15390       '),('CASODEX 50 MGS 28 TBS (E)(P)104334(SC)  '),('SEROQUEL 100 MG 30 TBS(E)(A)(P)55800    '),('SEROQUEL 200 MG 30 TBS (E)(A)(P)111600  '),('SEROQUEL 25 MG 30 TBS (A)(P)13950       '))V(ProductName))
SELECT V.ProductName,LEFT(S.R,ISNULL(NULLIF(CHARINDEX('(',S.R),0)-1,LEN(S.R))) AS ProductPrice
FROM VTE V
     CROSS APPLY (VALUES(PATINDEX('%(P)%',V.ProductName)))PI(I)
     CROSS APPLY (VALUES(STUFF(V.ProductName,1,PI.I+2,'')))S(R);
,

在示例数据中,数字均具有五位数字。这表明:

select left(stuff(str,patindex('%(P)[0-9][0-9][0-9][0-9]%',str) + 2,''),5)
from (values ('XARELTO 20 MG 14 COM.(A)(P)85003(SC)(SF)')) v(str);

SQL Server不能很好地处理字符串。可以对其进行修改以处理可变数目的数字,但是表达式要复杂一些。

编辑:

以下是任意长度的版本:

select left(v.str + ' ',patindex('%[^0-9]%',v.str + ' ') - 1)
from (values ('XARELTO 20 MG 14 COM.(A)(P)85003(SC)(SF)'),('SEROQUEL 200 MG 30 TBS (E)(A)(P)111600')
     ) x(str) cross apply
     (values (stuff(x.str,x.str) + 2,''))) v(str);
本文链接:https://www.f2er.com/3163361.html

大家都在问