从字符串中分离数值

时间:2018-09-27 08:16:17

标签: sql-server tsql

我遇到了一个问题,需要将以下BPO007分开以显示BPO007。在某些情况下,另一个示例是GFE0035,因此我仍然需要将数字值与字符分开。

当我执行以下select isnumeric('BPO007')时,结果为0,这是正确的,但是,我不确定如何将它们彼此分开。

我已经看过这个link,但它并不能真正回答我的问题。

我需要上述拆分,以便在触发器中单独进行验证。

我将如何发展这样的东西?

谢谢。

2 个答案:

答案 0 :(得分:1)

如之前的评论所述:

关于您的问题我将如何发展这样的东西?
不要在同一列中存储两条信息(有关 1.NF 的信息)。您应该在数据库中为 BPO 007 (或整数 7 )保留单独的列。
然后,在输出中需要它时,使用一些字符串方法来计算 BPO007

只是不要让你一个人在雨中。

DECLARE @tbl TABLE(YourColumn VARCHAR(100));
INSERT INTO @tbl VALUES('BPO007'),('GFE0035');

SELECT YourColumn,pos
      ,LEFT(YourColumn,pos) AS CharPart
      ,CAST(SUBSTRING(YourColumn,pos+1,1000) AS INT) AS NumPart
FROM @tbl 
CROSS APPLY(SELECT PATINDEX('%[0-9]%',YourColumn)-1) AS A(pos);

会回来

YourColumn  pos CharPart    NumPart
BPO007      3   BPO         7
GFE0035     3   GFE         35

提示:我在这里使用CROSS APPLY来计算第一个数字字符的位置,然后在实际查询中使用pos就像使用变量一样。否则,PATINDEX必须重复...

答案 1 :(得分:1)

由于数字和文本不同,您可以使用以下代码

DECLARE @NUMERIC TABLE (Col VARCHAR(50))
INSERT INTO @NUMERIC VALUES('BPO007'),('GFE0035'),('GFEGVT003509'),('GFEMTS10035')

SELECT
Col,
LEFT(Col,LEN(Col)-LEN(SUBSTRING(Col,PATINDEX('%[0-9]%',Col),DATALENGTH(Col)))) AS TEXTs,
RIGHT(Col,LEN(Col)-LEN(LEFT(Col,LEN(Col)-LEN(SUBSTRING(Col,PATINDEX('%[0-9]%',Col),DATALENGTH(Col)))))) AS NUMERICs

FROM @NUMERIC