返回的表达式将从表达式中指定的第一个字符开始“。因此,我假设0将转到1。这是真的,但由于SQL字符串通常是1索引的,因此将其视为1索引可能是有意义的。防止在使用其他函数(如CHARINDEX)时出现混淆。如果只有一个注释,则返回空白而不是注释。。。看看我的

返回的表达式将从表达式中指定的第一个字符开始“。因此,我假设0将转到1。这是真的,但由于SQL字符串通常是1索引的,因此将其视为1索引可能是有意义的。防止在使用其他函数(如CHARINDEX)时出现混淆。如果只有一个注释,则返回空白而不是注释。。。看看我的,sql,sql-server,Sql,Sql Server,返回的表达式将从表达式中指定的第一个字符开始“。因此,我假设0将转到1。这是真的,但由于SQL字符串通常是1索引的,因此将其视为1索引可能是有意义的。防止在使用其他函数(如CHARINDEX)时出现混淆。如果只有一个注释,则返回空白而不是注释。。。看看我的答案。(当然,除非一个音符以逗号结尾)子字符串不应该从1开始吗?@JordanKaye Manual声明“如果start小于1,返回的表达式将从表达式中指定的第一个字符开始”。因此,我假设0将转到1。这是真的,但由于SQL字符串通常是1索引的,


返回的表达式将从表达式中指定的第一个字符开始“。因此,我假设
0
将转到
1
。这是真的,但由于SQL字符串通常是1索引的,因此将其视为1索引可能是有意义的。防止在使用其他函数(如CHARINDEX)时出现混淆。如果只有一个注释,则返回空白而不是注释。。。看看我的答案。(当然,除非一个音符以逗号结尾)子字符串不应该从1开始吗?@JordanKaye Manual声明“如果start小于1,返回的表达式将从表达式中指定的第一个字符开始”。因此,我假设
0
将转到
1
。这是真的,但由于SQL字符串通常是1索引的,因此将其视为1索引可能是有意义的。防止在使用其他函数(如CHARINDEX)时出现混淆。如果只有一个注释,则返回空白而不是注释。。。看看我的答案。(当然,除非一个音符都以逗号结尾)
SELECT Name, Phone, Notes (only the first value)
FROM Table1 
SELECT Name, Phone, SUBSTRING(Notes, 1, CHARINDEX(',', Notes)) AS first_value
FROM Table1
DECLARE @csv varchar(50)
SET @csv = 'comma after this, and another,'

SELECT SUBSTRING(@csv, 1, CHARINDEX(',', @csv)) AS first_value
| first_value | -------------------- | comma after this |
SELECT Name, Phone, Left(Notes, CharIndex(',', Notes + ',')) FirstNote
  FROM Table1
with Table1(Name, Phone, Notes) as (
    select 'abc', '123', 'Some,notes,here' union all
    select 'abd', '124', 'Single-note' union all
    select 'abe', '125', '' union all
    select 'syz', '126', null
)
---
SELECT Name, Phone, Left(Notes, CharIndex(',', Notes + ',')-1) FirstNote
       ,SUBSTRING(Notes, 0, CHARINDEX(',', Notes)) AS njk
  FROM Table1 
Name Phone FirstNote       njk
---- ----- --------------- ---------------
abc  123   Some            Some
abd  124   Single-note     
abe  125                   
syz  126   NULL            NULL
SELECT name,
   phones, 
   split_part(notes, ',', 1) as first_notes  
FROM Table1
CREATE FUNCTION [dbo].[fnGetFieldXFromDelimitedList] (@SearchIn nvarchar(max)
    , @Delimiter char(1), @FieldNum int ) RETURNS nvarchar(max) as BEGIN
/*
fnGetFieldXFromDelimitedList(@SearchIn, @Delimiter, @FieldNum)
Returns the Nth value (specified by @FieldNum, first is 1 not 0)
    from @SearchIn assuming @SearchIn is a list of multiple values
    delimited by @Delimiter

DECLARE @SearchIn nvarchar(max) = 'F1, Field 2, F3,, F5, F6, F7'
DECLARE @Delimiter char(1) = ','
DECLARE @FieldNum int = 7
--*/
--SELECT dbo.fnGetFieldXFromDelimitedList ('F1, Field 2, F3,, F5, F6, F7', ',', 5)
DECLARE @PosStart int = 1 --SUBSTRING(SearchIn, StartPos, StrLen) considers 1 the first character
DECLARE @PosEnd INT = LEN(@SearchIn)
DECLARE @TempString nvarchar(max) = CONCAT(@SearchIn, @Delimiter)
DECLARE @TempNum INT = 1
DECLARE @RetVal nvarchar(max) = ''

--SElECT SUBSTRING(@SearchIn, 1, 1) 
SET @PosEnd = CHARINDEX(@Delimiter, @TempString, @PosStart + LEN(@Delimiter))
WHILE @TempNum < @FieldNum AND @PosStart > 0 AND @PosStart < LEN(@TempString) BEGIN
    SET @PosStart = CHARINDEX(@Delimiter, @TempString, @PosStart) + LEN(@Delimiter)
    SET @PosEnd = CHARINDEX(@Delimiter, @TempString, @PosStart)
    SET @TempNum = @TempNum + 1
    --SELECT @PosStart, @PosEnd , @TempNum 
END --WHILE

IF @TempNum = @FieldNum AND @PosEnd > 0 BEGIN
    SET @RetVal = SUBSTRING(@TempString, @PosStart, @PosEnd - @PosStart)
END ELSE BEGIN
    SET @RetVal = NULL
END

--SELECT @RetVal
RETURN @RetVal
END