SQL:从SQL列值中检索前三个字符
例如:如果sql列值为sa,则为123k,输出应为前三个字符,即sakSQL:从SQL列值中检索前三个字符,sql,sql-server,Sql,Sql Server,例如:如果sql列值为sa,则为123k,输出应为前三个字符,即sak 需要删除字母和任何特殊字符,并且只获取三个字符。我们怎么做呢?嗯,这很难看,但是你可以替换所有你不喜欢的角色 在您的示例中,这将是: SELECT REPLACE (REPLACE (REPLACE (REPLACE ('sa,123k', '1', ''), '2', ''), '3', ''), ',', '') 显然,如果需要替换所有数字和其他类型的字符,则需要大量替换 根据您的评论编辑: SELECT REPLAC
需要删除字母和任何特殊字符,并且只获取三个字符。我们怎么做呢?嗯,这很难看,但是你可以替换所有你不喜欢的角色 在您的示例中,这将是:
SELECT REPLACE (REPLACE (REPLACE (REPLACE ('sa,123k', '1', ''), '2', ''), '3', ''), ',', '')
显然,如果需要替换所有数字和其他类型的字符,则需要大量替换
根据您的评论编辑:
SELECT REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE ('123456gh,.!879k', '1', ''), '2', ''), '3', ''), ',', ''), '4', ''), '5', ''), '6', ''), '.', ''), '!', ''), '7', ''), '8', ''), '9', '')
嗯,这很难看,但是你可以替换所有你不喜欢的角色 在您的示例中,这将是:
SELECT REPLACE (REPLACE (REPLACE (REPLACE ('sa,123k', '1', ''), '2', ''), '3', ''), ',', '')
显然,如果需要替换所有数字和其他类型的字符,则需要大量替换
根据您的评论编辑:
SELECT REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (REPLACE ('123456gh,.!879k', '1', ''), '2', ''), '3', ''), ',', ''), '4', ''), '5', ''), '6', ''), '.', ''), '!', ''), '7', ''), '8', ''), '9', '')
为此,可以使用递归CTE:
with t as (
select 'sa,123k' as str
),
cte as (
select str, left(str, 1) as c, stuff(str, 1, 1, '') as rest, 1 as lev,
convert(varchar(max), (case when left(str, 1) like '[a-zA-Z]' then left(str, 1) else '' end)) as chars
from t
union all
select str, left(rest, 1) as c, stuff(rest, 1, 1, '') as rest, lev + 1,
convert(varchar(max), (case when left(rest, 1) like '[a-zA-Z]' then chars + left(rest, 1) else chars end))
from cte
where rest > '' and len(chars) < 3
)
select str, max(chars)
from cte
where len(chars) <= 3
group by str;
是一个dbfiddle。为此,可以使用递归CTE:
with t as (
select 'sa,123k' as str
),
cte as (
select str, left(str, 1) as c, stuff(str, 1, 1, '') as rest, 1 as lev,
convert(varchar(max), (case when left(str, 1) like '[a-zA-Z]' then left(str, 1) else '' end)) as chars
from t
union all
select str, left(rest, 1) as c, stuff(rest, 1, 1, '') as rest, lev + 1,
convert(varchar(max), (case when left(rest, 1) like '[a-zA-Z]' then chars + left(rest, 1) else chars end))
from cte
where rest > '' and len(chars) < 3
)
select str, max(chars)
from cte
where len(chars) <= 3
group by str;
这可能会有帮助
DECLARE @VAR VARCHAR(100)= 'sa,1235JSKL', @RESULT VARCHAR(MAX)=''
SELECT @RESULT = @RESULT+
CASE WHEN RESULT LIKE '[a-zA-Z]' THEN RESULT ELSE '' END
FROM (
SELECT NUMBER, SUBSTRING(@VAR,NUMBER,1) AS RESULT
FROM MASTER..spt_values
WHERE TYPE = 'P' AND NUMBER BETWEEN 1 AND LEN(@VAR)
)A
ORDER BY NUMBER
SELECT SUBSTRING(@RESULT,1,3)
如果要将此应用于Tables列,则需要使用相同的逻辑创建标量函数。您可以找到更多关于如何通过谷歌创建标量函数的文章。这可能会有所帮助
DECLARE @VAR VARCHAR(100)= 'sa,1235JSKL', @RESULT VARCHAR(MAX)=''
SELECT @RESULT = @RESULT+
CASE WHEN RESULT LIKE '[a-zA-Z]' THEN RESULT ELSE '' END
FROM (
SELECT NUMBER, SUBSTRING(@VAR,NUMBER,1) AS RESULT
FROM MASTER..spt_values
WHERE TYPE = 'P' AND NUMBER BETWEEN 1 AND LEN(@VAR)
)A
ORDER BY NUMBER
SELECT SUBSTRING(@RESULT,1,3)
如果要将此应用于Tables列,则需要使用相同的逻辑创建标量函数。您可以找到更多关于如何通过谷歌创建标量函数的文章。您可以使用由编写的此函数来执行此操作
Create Function [dbo].[RemoveNonAlphaCharacters](@Temp nvarchar(MAX))
Returns nvarchar(MAX)
AS
Begin
Declare @KeepValues as nvarchar(MAX)
Set @KeepValues = '%[^a-z]%'
While PatIndex(@KeepValues, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
Return @Temp
End
那就简单地把这个函数称为
SELECT LEFT(dbo.RemoveNonAlphaCharacters(colName), 3)
FROM TableName
参考:您可以使用编写的此函数来执行此操作
Create Function [dbo].[RemoveNonAlphaCharacters](@Temp nvarchar(MAX))
Returns nvarchar(MAX)
AS
Begin
Declare @KeepValues as nvarchar(MAX)
Set @KeepValues = '%[^a-z]%'
While PatIndex(@KeepValues, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
Return @Temp
End
那就简单地把这个函数称为
SELECT LEFT(dbo.RemoveNonAlphaCharacters(colName), 3)
FROM TableName
参考资料:如果您使用的是SQL Server 2017,您可以使用translate,否则这将非常困难。还有,我想你指的是前三个字母。您的问题中的所有内容都是字符。如果您可以访问正则表达式工具,则您可能希望将[^a-Za-z]+替换为空字符串。如果您的数据库长期以来需要完全的正则表达式支持,那么不妨看看Postgres或Oracle。如果您使用的是SQL Server 2017,则可以使用translate,否则这将相当困难。还有,我想你指的是前三个字母。您的问题中的所有内容都是字符。如果您可以访问正则表达式工具,则您可能希望将[^a-Za-z]+替换为空字符串。如果您的数据库长期以来需要完全的正则表达式支持,那么可以看看Postgres或Oracle之类的东西,。!879k那么使用脚本将很难找到答案。我有很多像这样的值要找出,我认为最好的选择是循环通过,但我不知道如何做,如果列值是123456gh,。!879k那么使用脚本将很难找到答案。我有很多像这样的价值观要寻找,我认为最好的选择是循环,但我不知道怎么做