我有一个名为 TCODE 的列,其值类似于 5T、6545H、25 和 S4444。现在,我只想要返回的 4 行中的 3 行,以及这些列 T、H 或 S 的以下非数字位。表名是 CODES 。
伪代码 从 CODES 中选择 TCODE,在其中我去掉了那些存在数字和非数字混合的列的数字部分。
预期成绩
TCODE
T
H
S
我怎样才能做到这一点 ?
我有一个名为 TCODE 的列,其值类似于 5T、6545H、25 和 S4444。现在,我只想要返回的 4 行中的 3 行,以及这些列 T、H 或 S 的以下非数字位。表名是 CODES 。
伪代码 从 CODES 中选择 TCODE,在其中我去掉了那些存在数字和非数字混合的列的数字部分。
预期成绩
TCODE
T
H
S
我怎样才能做到这一点 ?
在 SQL Server 中,您可以使用 PATINDEX:
SELECT SUBSTRING(TCODE,PATINDEX('%[^0-9]%', TCODE),1)
FROM CODES
WHERE PATINDEX('%[^0-9]%',TCODE) > 0
我想到的方式是相当野蛮的:
select replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(tcode, '0', ''),
'1', 0),
'2', 0),
'3', 0),
'4', 0),
'5', 0),
'6', 0),
'7', 0),
'8', 0),
'9', 0) as theletters
. . .
您可以将其放在子查询中,然后选择where theletters <> ''
进行过滤。
一种选择:
with cte as
(select 0 n, replace(tcode,'0','') tcode from codes
union all
select n+1 n, replace(tcode,convert(varchar,n+1),'') tcode
from cte
where n<9)
select tcode from cte
where n=9
(这里的 SQLFiddle )
您可以创建这样的功能
CREATE FUNCTION RemoveDigits(@strText VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
WHILE PATINDEX('%[0-9]%', @strText) > 0
BEGIN
SET @strText = STUFF(@strText, PATINDEX('%[0-9]%', @strText), 1, '')
END
RETURN @strText
END
GO
然后使用它
SELECT dbo.RemoveDigits(TCODE) TCODE
FROM CODES
WHERE PATINDEX('%[^0-9]%', TCODE) > 0
输出:
| TCODE |
---------
| T |
| H |
| S |