我有一个名为TCODE的列,其值类似于5T,6545H,25和S4444。 现在我只想要返回的4行中只有3行,只有那些列T,H或S的非数字位。表名是CODES。
伪代码 从CODES中选择TCODE,我在其中删除存在数字和非数字混合的那些列的数字部分。
预期结果
TCODE
T
H
S
我该怎么做?
答案 0 :(得分:1)
在SQL Server中,您可以使用PATINDEX:
SELECT SUBSTRING(TCODE,PATINDEX('%[^0-9]%', TCODE),1)
FROM CODES
WHERE PATINDEX('%[^0-9]%',TCODE) > 0
答案 1 :(得分: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 <> ''
进行过滤。
答案 2 :(得分: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 here)
答案 3 :(得分: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 强>