首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用charindex和ltrim

使用charindex和ltrim
EN

Stack Overflow用户
提问于 2016-07-06 09:42:46
回答 4查看 387关注 0票数 3

我有一列数据是这样的

代码语言:javascript
复制
 DOESTOEIVSKI ALEXANDER
JAMES JOYCE
ROBERT LUDLUM
 MURAKAMI HARUKU 

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

我在查询#1中完成了这一操作:

代码语言:javascript
复制
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

第一个问题是我有

代码语言:javascript
复制
 DOESTOEIVSKI ALEXANDER
James JOYCE
Murakami HARUKU
 ROBERT LUDLUM

我希望对DOESTOEIVSKIROBERT有相同的结果

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

代码语言:javascript
复制
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参数长度对左或超静置无效。

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

代码语言:javascript
复制
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')))

有人能给我解释一下吗?

谢谢

Update:在Zohar发表评论之后,我查看了该字段的数据定义。这是一个身份..。我认为这确实有区别,但我不知道怎么做或为什么.

DDL

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-06 10:49:34

下面的行引起了问题,当PRENOM有空值CHARINDEX将给0,所以SUBSTRING有最后的值为-1!

代码语言:javascript
复制
CHARINDEX( ' ', LTRIM(PARTPPHY.IDENTITE)) - 1)

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

代码语言:javascript
复制
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 
票数 1
EN

Stack Overflow用户

发布于 2016-07-06 09:52:22

下面是一个可行的解决方案:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-07-06 10:34:40

就像这样,

代码语言:javascript
复制
SELECT upper(left(identite, 1)) + lower(substring(identite, 2, charindex(' ', identite) - 1)) + upper(substring(identite, charindex(' ', identite) + 1, len(identite))) AS identite
FROM PARTPPHY
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38220904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档