0

我有一个名为 TCODE 的列,其值类似于 5T、6545H、25 和 S4444。现在,我只想要返回的 4 行中的 3 行,以及这些列 T、H 或 S 的以下非数字位。表名是 CODES 。

伪代码 从 CODES 中选择 TCODE,在其中我去掉了那些存在数字和非数字混合的列的数字部分。

预期成绩

TCODE 
T
H
S

我怎样才能做到这一点 ?

4

4 回答 4

1

在 SQL Server 中,您可以使用 PATINDEX:

SELECT SUBSTRING(TCODE,PATINDEX('%[^0-9]%', TCODE),1)
FROM CODES
WHERE PATINDEX('%[^0-9]%',TCODE) > 0
于 2013-04-04T16:37:00.770 回答
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 <> ''进行过滤。

于 2013-04-04T16:01:25.500 回答
0

一种选择:

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 )

于 2013-04-04T16:12:33.307 回答
0

您可以创建这样的功能

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 |

SQLFiddle

于 2013-04-04T16:14:57.363 回答