我遇到了一个问题,需要将以下BPO007
分开以显示BPO
和007
。在某些情况下,另一个示例是GFE0035
,因此我仍然需要将数字值与字符分开。
当我执行以下select isnumeric('BPO007')
时,结果为0,这是正确的,但是,我不确定如何将它们彼此分开。
我已经看过这个link,但它并不能真正回答我的问题。
我需要上述拆分,以便在触发器中单独进行验证。
我将如何发展这样的东西?
谢谢。
答案 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