Sql server 如何在SQL server数据库中使用SQL选择特定字符

Sql server 如何在SQL server数据库中使用SQL选择特定字符,sql-server,Sql Server,如何仅选择以字母开头的信息 我有一个表,有5列,其中一列(即注释列)中有如下信息: #2345 Changed by Mark Paul changed ticket number #5923 Someone changed ticket number #5823 and #9333 #3555 is missing from the list, can only see #5789, #9000 and #4568 在上面4行的示例中,我希望select语句只返回票证号,如下所示: 评

如何仅选择以字母开头的信息

我有一个表,有5列,其中一列(即注释列)中有如下信息:

#2345 Changed by Mark

Paul changed ticket number #5923

Someone changed ticket number #5823 and #9333

#3555 is missing from the list, can only see #5789, #9000 and #4568
在上面4行的示例中,我希望select语句只返回票证号,如下所示:

评论

 #2345 

 #5923

 #5823,  #9333

 #5789, #9000, #4568

有人说正则表达式可以为我做这项工作,但我是一名应届毕业生,以前从未见过这样的情况。你能帮助我吗??< /P> < P>使用SQL从数据库表中选择所需字段,然后在另一种语言(如C++、PHP等)上执行ReGEX操作,当将结果输出到客户端

第一创建函数以提取数值

CREATE FUNCTION dbo.udf_GetNumeric
(
@strAlphaNumeric VARCHAR(256))
RETURNS VARCHAR(256
)
AS
BEGIN
DECLARE @intAlpha INT
SET @intAlpha = PATINDEX('%[^#0-9]%', @strAlphaNumeric)
BEGIN
WHILE @intAlpha > 0
BEGIN
SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '' )
SET @intAlpha = PATINDEX('%[^#0-9]%', @strAlphaNumeric )
END
END
RETURN ISNULL(@strAlphaNumeric,0)
END
GO
Declare @TempTable TABLE(ID Int Identity,Value varchar(1000))
INSERT INTO @TempTable
          SELECT '#2345 Changed by Mark'                                                
UNION ALL SELECT 'Paul changed ticket number #5923'
UNION ALL SELECT 'Someone changed ticket number #5823 and #9333'
UNION ALL SELECT '#3555 is missing from the list, can only see #5789, #9000 and #4568'

 SELECT ID, 
 RIGHT(LTRIM(REPLACE(Value,'#',' ,#')),LEN(RTRIM(LTRIM(REPLACE(Value,'#',' ,#'))))-1)AS Value FROM
 (
 SELECT ID,dbo.udf_GetNumeric(Value) AS Value From @TempTable
 )Dt
通过使用下面的代码,我们可以提取数值

CREATE FUNCTION dbo.udf_GetNumeric
(
@strAlphaNumeric VARCHAR(256))
RETURNS VARCHAR(256
)
AS
BEGIN
DECLARE @intAlpha INT
SET @intAlpha = PATINDEX('%[^#0-9]%', @strAlphaNumeric)
BEGIN
WHILE @intAlpha > 0
BEGIN
SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '' )
SET @intAlpha = PATINDEX('%[^#0-9]%', @strAlphaNumeric )
END
END
RETURN ISNULL(@strAlphaNumeric,0)
END
GO
Declare @TempTable TABLE(ID Int Identity,Value varchar(1000))
INSERT INTO @TempTable
          SELECT '#2345 Changed by Mark'                                                
UNION ALL SELECT 'Paul changed ticket number #5923'
UNION ALL SELECT 'Someone changed ticket number #5823 and #9333'
UNION ALL SELECT '#3555 is missing from the list, can only see #5789, #9000 and #4568'

 SELECT ID, 
 RIGHT(LTRIM(REPLACE(Value,'#',' ,#')),LEN(RTRIM(LTRIM(REPLACE(Value,'#',' ,#'))))-1)AS Value FROM
 (
 SELECT ID,dbo.udf_GetNumeric(Value) AS Value From @TempTable
 )Dt
如果需要提取数值而不是预先固定的wirh符号

SELECT ID, 
 REPLACE(RIGHT(LTRIM(REPLACE(Value,'#',' ,#')),LEN(RTRIM(LTRIM(REPLACE(Value,'#',' ,#'))))-1),'#',' ')AS Value FROM
 (
 SELECT ID,dbo.udf_GetNumeric(Value) AS Value From @TempTable
 )Dt
输出

ID  Value
----------
1   #2345
2   #5923
3   #5823 ,#9333
4   #3555 ,#5789 ,#9000 ,#4568
ID  ColumnsWith#ValuesOnly
---------------------------
1    #2345, #111111, #5656
2    #5923, #010101, #4
3    #5823, #9333
4    #3555, #5789, #9000, #4568

最好的方法是使用以下脚本:

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
Drop table #TempTable

CREATE TABLE [dbo].#TempTable(
    [ID] [int] NOT NULL,
    [Value] [varchar](1000) NULL
) ON [PRIMARY]


INSERT [dbo].#TempTable ([ID], [Value]) VALUES (1, N'#2345 Changed by Mark #111111,767677,33333,#5656 vbvb')
GO
INSERT [dbo].#TempTable ([ID], [Value]) VALUES (2, N'Paul changed ticket number #5923,5555555 464646 #010101,5555544rrr,wwww AND #4 ')
GO
INSERT [dbo].#TempTable ([ID], [Value]) VALUES (3, N'Someone changed ticket number #5823 and #9333,7777')
GO
INSERT [dbo].#TempTable ([ID], [Value]) VALUES (4, N'#3555 is missing from the list, can only see #5789, #9000 and #4568')
GO


;WITH cte
AS
(
 SELECT ID,Split.a.value('.', 'VARCHAR(1000)') AS TablesData
            FROM (
                SELECT ID,CAST('<S>' + REPLACE(Value, ' ', '</S><S>') + '</S>' AS XML) AS TablesData
                FROM #TempTable
                ) AS A
            CROSS APPLY TablesData.nodes('/S') AS Split(a)
)
,Final
AS
(
SELECT ID,TablesData FROM 
(
SELECT ID, Split.a.value('.', 'VARCHAR(1000)') AS TablesData,CHARINDEX('#',Split.a.value('.', 'VARCHAR(1000)')) AS Data2
            FROM (
                SELECT ID,CAST('<S>' + REPLACE(TablesData, ',', '</S><S>') + '</S>' AS XML) AS TablesData
                FROM cte
                ) AS A
            CROSS APPLY TablesData.nodes('/S') AS Split(a)
            )DT
            WHERE dt.Data2 <>0

)

SELECT DISTINCT ID
    ,STUFF((
            SELECT ', ' + CAST(TablesData AS VARCHAR(50))
            FROM Final i
            WHERE i.ID = o.ID
            FOR XML PATH('')
            ), 1, 1, '') AS ColumnsWith#ValuesOnly
FROM Final o
ORDER BY 1 ASC

这将是SQL Server中的一个难题,因为它对本机正则表达式的支持很弱。您必须在数据库中执行此操作吗?那么像Java这样的语言呢?如果你能使用CLR,那就不太麻烦了functions@MartinSmith我正在使用powershell查询数据库,但正如我所说,我对这个开发世界仍然是新手,现在对我来说非常痛苦。你能帮忙吗?@不朽我添加了新的答案,它只返回数字。任何不带数字的数字都将无效return@Immortal您是否得到了预期的结果添加表名而不是表名?我可能不熟悉Powershell中的这些语言?你有什么例子吗?光靠Power shell是不行的,至少我是这么认为的。据我所知,SQL只是用于查询RDBMS中的数据,许多复杂的内容是由其他编程语言处理的。如果我有1000多行这样的数据,您的解决方案将如何工作?请使用您的表名,而不是使用@Attable SELECT ID、RIGHTLTRIMREPLACEValue、、'、'、LENRTRIMLTRIMREPLACEValue、、'-1作为SELECT ID中的值,dbo.udf_GetNumericValue作为@tentable DtYes中的值它现在工作,但是它现在选择列中的每个数字,而不是只选择以例如:5923开头的数字。如何修改?如果只需要数字而不需要前缀?我只需要带前缀的数字。不应返回任何不带数字的数字