问题:我想从字符串中检索第一个非空值,子字符串用,作为分隔符分隔。
场景:
字符串1 - ,1002682657
字符串2 - 1002682683,
String 3 - ,, 1002682684
字符串4 - ,,,
String 5 - 1002682664,1002682663
ResultString 1 - 1002682657
ResultString 2 - 1002682683
ResultString 3 - 1002682684
ResultString 4 - 空值
ResultString 5 - 1002682664
所以要检索这个我写的函数是脚本
CREATE FUNCTION [dbo].[Return_first_NonNull_Value_From_list]
(
@List NvarChar(MAX)
)
RETURNS NVarChar
AS
BEGIN
-- Declare the return variable here
DECLARE @ReturnListPart NvarChar(max)
DECLARE @Start INT
DECLARE @End INT
DECLARE @Length INT
DECLARE @Length_String INT
SET @Start = 1
SET @End = CHARINDEX(',',@List,@Start)
SET @Length = (@End - @Start) + 1
SET @Length_String= (@END-@Start)+1
SET @pos = 0
SET @nextpos = 1
WHILE @Start>0 and @End>0 and @Length_String>0
BEGIN
IF (SUBSTRING(@List, @Start, 1) <> '') AND (SUBSTRING(@List, @Start,2) <>'')
BEGIN
SET @ReturnListPart = SUBSTRING(@List,@Start,@Length)
SET @Length_String= LEN(@ReturnListPart)
IF @Length_String > 1
BEGIN
SET @Length_String =0
END
END
ELSE
BEGIN
-- Replace the string with null value if null
SET @List = LTRIM(RTRIM(STUFF(@List,@Start,@Length,'')))
SET @Length_String = LEN(@List)
END
END
RETURN RTRIM(LTRIM(@ReturnListPart))
END
但是这个函数没有返回预期的结果。有人可以帮我解决这个问题吗?
答案 0 :(得分:0)
根据你的问题有两个假设,你可以很容易地做到这一点。看起来你的数字都是10个字符长,而且它们只有数字(没有字符)。
考虑到这一点,你可以用这样的模式匹配来做到这一点:
SELECT CASE WHEN [Value] LIKE '%[0-9]%' THEN SUBSTRING([Value], PATINDEX('%[0-9]%', [Value]), 10)
ELSE NULL
END [Value]
FROM [#Test]
我们可以直接折扣任何没有数字字符的行并返回null,其余的我们会查找第一个数字字符并获得接下来的10个字符。
在sql server中运行的完整示例将是:
CREATE TABLE [#Test]
(
[Value] NVARCHAR(1000)
)
INSERT INTO [#Test] ( [Value] ) VALUES ( N',1002682657')
INSERT INTO [#Test] ( [Value] ) VALUES ( N'1002682683,')
INSERT INTO [#Test] ( [Value] ) VALUES ( N',,1002682684')
INSERT INTO [#Test] ( [Value] ) VALUES ( N',,,')
INSERT INTO [#Test] ( [Value] ) VALUES ( N',1002682664,1002682663')
SELECT CASE WHEN [Value] LIKE '%[0-9]%' THEN SUBSTRING([Value], PATINDEX('%[0-9]%', [Value]), 10)
ELSE NULL
END [Value]
FROM [#Test]
DROP TABLE [#Test]