Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:从SQL列值中检索前三个字符_Sql_Sql Server - Fatal编程技术网

SQL:从SQL列值中检索前三个字符

SQL:从SQL列值中检索前三个字符,sql,sql-server,Sql,Sql Server,例如:如果sql列值为sa,则为123k,输出应为前三个字符,即sak 需要删除字母和任何特殊字符,并且只获取三个字符。我们怎么做呢?嗯,这很难看,但是你可以替换所有你不喜欢的角色 在您的示例中,这将是: SELECT REPLACE (REPLACE (REPLACE (REPLACE ('sa,123k', '1', ''), '2', ''), '3', ''), ',', '') 显然,如果需要替换所有数字和其他类型的字符,则需要大量替换 根据您的评论编辑: SELECT REPLAC

例如:如果sql列值为sa,则为123k,输出应为前三个字符,即sak


需要删除字母和任何特殊字符,并且只获取三个字符。我们怎么做呢?

嗯,这很难看,但是你可以替换所有你不喜欢的角色

在您的示例中,这将是:

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那么使用脚本将很难找到答案。我有很多像这样的价值观要寻找,我认为最好的选择是循环,但我不知道怎么做