返回的表达式将从表达式中指定的第一个字符开始“。因此,我假设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