gpt4 book ai didi

sql - 使用 charindex 和 ltrim

转载 作者:行者123 更新时间:2023-12-04 22:31:58 28 4
gpt4 key购买 nike

我有一列数据是这样的

 DOESTOEIVSKI ALEXANDER
JAMES JOYCE
ROBERT LUDLUM
MURAKAMI HARUKU

目标:使第一个字符串大写,其余小写,第二个字符串保持大写

我已经用查询 #1 完成了它:

SELECT (UPPER(LEFT(PARTPPHY.IDENTITE,1))
+LOWER(SUBSTRING( PARTPPHY.IDENTITE, 2, CHARINDEX( ' ', PARTPPHY.IDENTITE ) - 1))
+SUBSTRING(PARTPPHY.IDENTITE,CHARINDEX( ' ', PARTPPHY.IDENTITE ),DATALENGTH(PARTPPHY.IDENTITE))),PARTPPHY.IDENTITE)
AS IDENTITE
FROM PARTPPHY

#1 的问题是我有这个

 DOESTOEIVSKI ALEXANDER
James JOYCE
Murakami HARUKU
ROBERT LUDLUM

我希望 DOESTOEIVSKIROBERT 得到相同的结果

我尝试了 ltrim,如下面的查询 #2 所示:

SELECT UPPER(LEFT(LTRIM(PARTPPHY.IDENTITE),1))
+LOWER(SUBSTRING(LTRIM(PARTPPHY.IDENTITE), 2, CHARINDEX( ' ', LTRIM(PARTPPHY.IDENTITE)) - 1))
+SUBSTRING(LTRIM(PARTPPHY.IDENTITE),CHARINDEX( ' ', LTRIM(PARTPPHY.IDENTITE) ),DATALENGTH(LTRIM(PARTPPHY.IDENTITE)))
AS IDENTITE
FROM PARTPPHY

问题是我有这个错误

Msg 537, level 16, State 2, Ligne 17 Parameter length non valid for LEFT or SUBSTRING.

然而,当我尝试使用查询 #3(见下文)时,一切都很好

SELECT UPPER(LEFT(LTRIM(' JEAN TOTOT'),1))
+LOWER(SUBSTRING(LTRIM(' JEAN TOTOT'), 2, CHARINDEX( ' ', LTRIM(' JEAN TOTOT')) - 1))
+SUBSTRING(LTRIM(' JEAN TOTOT'),CHARINDEX( ' ', LTRIM(' JEAN TOTOT') ),DATALENGTH(LTRIM(' JEAN TOTOT')))

谁能给我一个解释?

谢谢

更新:在Zohar的评论之后,我看了看字段的数据定义。这是一个身份...我认为它确实有所不同,但我不确定如何或为什么...

DDL:

CREATE TABLE [dbo].[PARTPPHY1](
[IU_PART_PP] [int] IDENTITY(1,1) NOT NULL,
[TITRE] [int] NULL,
[NOM_NAISSANCE] [varchar](100) NULL,
[NOM_USAGE] [varchar](100) NULL,
[PRENOM] [varchar](20) NULL,
[AUTRES_PRENOMS] [varchar](60) NULL,
[IDENTITE] AS ((([PRENOM]+' ')
+case when isnull([NOM_USAGE],'')=''
then [NOM_NAISSANCE] else [NOM_USAGE] end)
+case when nullif([NOM_USAGE],'') IS NULL then '' else (' (NEE '+[NOM_NAISSANCE])+')' end))

DML

INSERT INTO PARTPPHY (IU_PART_PP,NOM_NAISSANCE,PRENOM)
VALUES(1,'BOUDJENAH','MICHEL')
INSERT INTO PARTPPHY ([IU_PART_PP],[NOM_NAISSANCE],[PRENOM])
VALUES(1,'','MIKE')
INSERT INTO PARTPPHY ([IU_PART_PP],[NOM_NAISSANCE],[PRENOM])
VALUES(1,'DOE','JOHN')
INSERT INTO PARTPPHY ([IU_PART_PP],[NOM_NAISSANCE],[PRENOM])
VALUES(1,'SMITH','STAN')
INSERT INTO PARTPPHY ([IU_PART_PP],[NOM_NAISSANCE],[PRENOM])
VALUES(1,'OPRAH','')
INSERT INTO PARTPPHY ([IU_PART_PP],[NOM_NAISSANCE],[PRENOM])
VALUES(1,'DESI','LU')
INSERT INTO PARTPPHY ([IU_PART_PP],[NOM_NAISSANCE],[PRENOM])
VALUES(1,'JORDAN MIKE',NULL)

最佳答案

下一行引起了问题,当 PRENOM 为空值时,CHARINDEX 将给出 0,因此 SUBSTRING 的最后一个值为 -1!

CHARINDEX( ' ', LTRIM(PARTPPHY.IDENTITE)) - 1)

试试这个,它会首先检查字符串的两个部分是否可用,然后对两个字符串部分使用逻辑,否则使用其他逻辑。

SELECT IDENTITE,
CASE WHEN CHARINDEX( ' ', LTRIM(PARTPPHY.IDENTITE)) > 0 THEN
UPPER(LEFT(LTRIM(PARTPPHY.IDENTITE),1))
+LOWER(SUBSTRING(LTRIM(PARTPPHY.IDENTITE), 2, CHARINDEX( ' ', LTRIM(PARTPPHY.IDENTITE)) - 1 ))
+SUBSTRING(LTRIM(PARTPPHY.IDENTITE),CHARINDEX( ' ', LTRIM(PARTPPHY.IDENTITE) ),DATALENGTH(LTRIM(PARTPPHY.IDENTITE)))
ELSE
UPPER(LEFT(LTRIM(PARTPPHY.IDENTITE),1))
+ ISNULL(LOWER(STUFF(LTRIM(PARTPPHY.IDENTITE), 1,1, '')),'')
END
AS IDENTITE1
FROM PARTPPHY

关于sql - 使用 charindex 和 ltrim,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38220904/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com