我有一个数据库就像这样的列
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
我希望DOESTOEIVSKI
或ROBERT
我尝试了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,16级,州2,Ligne 17 参数长度对LEFT或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)
答案 0 :(得分:1)
这是一个有效的解决方案:
SELECT IDENTITE,
LEFT(LTRIM(IDENTITE), 1) +
LOWER(SUBSTRING(LTRIM(IDENTITE), 2, CHARINDEX(' ', LTRIM(IDENTITE) + ' ') - 1)) +
CASE WHEN CHARINDEX(' ', LTRIM(RTRIM(IDENTITE))) > 0 THEN
RIGHT(IDENTITE, LEN(IDENTITE) - CHARINDEX(' ', LTRIM(IDENTITE)))
ELSE '' END
FROM PARTPPHY
WHERE IDENTITE IS NOT NULL
您的问题是您的数据中间没有空格。
答案 1 :(得分:1)
试试这个,
SELECT upper(left(identite, 1)) + lower(substring(identite, 2, charindex(' ', identite) - 1)) + upper(substring(identite, charindex(' ', identite) + 1, len(identite))) AS identite
FROM PARTPPHY
答案 2 :(得分:1)
以下行导致问题,当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
答案 3 :(得分:1)
资本化问题与身份或计算列无关。
您有DOESTOEIVSKI ALEXANDER
和MURAKAMI HARUKU
的前导空格。您的公式在您找到的第一个空格后大写。因此,整个名称都是大写的。
这就是为什么添加LTRIM解决了这个问题。