简化LEFT / REPLACE查询

时间:2012-07-25 16:11:21

标签: sql sql-server sql-server-2008 tsql

我有一个急需简化的查询。以下是查询的一部分:

SELECT
    LEFT(MLIS.REQUESTOR_FIRST_NAME, CharIndex( ' ', MLIS.REQUESTOR_FIRST_NAME + ' ' ) - 1)

    , CharIndex( ' ', LEFT(MLIS.REQUESTOR_FIRST_NAME, CharIndex( ' ', MLIS.REQUESTOR_FIRST_NAME + ' ' ) - 1) + ' ' ) - 1)

    +REPLICATE(' ',25),25)+
    LEFT(' '+REPLICATE(' ',20),20)+
    LEFT(

    LEFT(

    LEFT(MLIS.REQUESTOR_LAST_NAME, CharIndex( ',', MLIS.REQUESTOR_LAST_NAME + ',' ) - 1)

    , CharIndex( ',', LEFT(MLIS.REQUESTOR_LAST_NAME, CharIndex( ',', MLIS.REQUESTOR_LAST_NAME + ',' ) - 1) + ',' ) - 1)

我正在进行replicates的原因是因为我正在构建一个固定长度的字符串。每列需要固定长度。

除上述查询外,我需要执行MLIS.REQUESTOR_FIRST_NAMEMLIS.REQUESTOR_LAST_NAME的每次出现:

REPLACE(REPLACE(MLIS.REQUESTOR_FIRST_NAME,', MD',''),',MD','')

REPLACE(REPLACE(MLIS.REQUESTOR_LAST_NAME,', MD',''),',MD','')

如何在查询中包含这些REPLACES并简化整个过程?

非常感谢您的指导和亲切的帮助。

2 个答案:

答案 0 :(得分:1)

选择子查询中的公共位...(您还需要更多)

SELECT
    LEFT(REQUESTOR_FIRST_NAME, fname_idx - 1)
    , CharIndex( ' ', LEFT(MLIS.REQUESTOR_FIRST_NAME, fname_idx - 1) + ' ' ) - 1)
..
FROM ( select CharIndex( ' ', MLIS.REQUESTOR_FIRST_NAME + ' ' ) fname_idx, REQUESTOR_FIRST_NAME from...

答案 1 :(得分:1)

使用子查询将有助于语法。此外,您可以强制转换为CHAR()以填充并截断给定长度的字符串。

我认为以下是您想要的:

SELECT cast(fname as char(25)) + ' ' + cast(lname as char(25))
from (select replace(replace(LEFT(MLIS.REQUESTOR_FIRST_NAME,
                                  CharIndex(' ', MLIS.REQUESTOR_FIRST_NAME + ' ' ) - 1
                                 ),
                             ',MD', ''),
                     ', MD', '') as fname,
             replace(relpace(left(MLIS.REQUESTOR_LAST_NAME,
                                  CharIndex(',', MLIS.REQUESTOR_LAST_NAME + ',' ) - 1),
                                  CharIndex(',', LEFT(MLIS.REQUESTOR_LAST_NAME,
                                                      CharIndex( ',', MLIS.REQUESTOR_LAST_NAME + ',' ) - 1) + ','
                                                               ) - 1
                                 ),
                             ',MD', ''),
                     ', MD', '') as lname

但是,很难遵循原始查询,并且可能存在语法错误。此查询旨在为您提供解决问题的一些指导。我也会在连接之后放置一个强制转换,以确保最终的字符串是正确的长度。