代码之家  ›  专栏  ›  技术社区  ›  user1184100

无法使用LTRIM&RTRIM搜索带空格的记录

  •  -1
  • user1184100  · 技术社区  · 7 年前

    | patientFirstName | patientMiddleName | patientLastName |  startdate |    enddate |    
    |------------------|-------------------|-----------------|------------|------------|    
    |          Patient |              Demo |            Test | 2018-09-02 | 2018-09-08 |    
    |             John |               Doe |            Demo | 2018-09-02 | 2018-09-14 |    
    |         Demo User|                   |                 | 2018-09-18 | 2018-09-28 |
    

    在上表中,我试图搜索用户“Demo user”,我的搜索输入是“demouser”。我试着删去空白,但还是看不到结果。

    DECLARE @searchInput varchar(10)
    DECLARE @startTime DATE
    DECLARE @endTime DATE
    SET @searchInput = 'demouser'
    SET @startTime   = '2018-09-18'
    SET @endTime     = '2018-09-28'
    
    SELECT * FROM PatientDemoTable
    WHERE (@startTime IS NULL OR startdate >= @startTime)
    AND   (@endTime   IS NULL OR enddate   <= @endTime)
    AND   ( LTRIM(RTRIM(@searchInput)) IS NULL OR patientFirstName like 
    '%'+LTRIM(RTRIM(@searchInput))+'%'
         OR LTRIM(RTRIM(@searchInput)) IS NULL OR patientMiddleName like 
    '%'+LTRIM(RTRIM(@searchInput))+'%'
         OR LTRIM(RTRIM(@searchInput)) IS NULL OR patientLastName like 
    '%'+LTRIM(RTRIM(@searchInput))+'%') 
    

    http://sqlfiddle.com/#!18/93ce1/33

    注意:我不能使用TRIM,因为我使用的是较旧的sqlserver

    3 回复  |  直到 7 年前
        1
  •  2
  •   Ilyes    7 年前

    好吧,你可以用 REPLACE() 函数(从SQL Server 2008开始)如下:

    DECLARE @T TABLE
    (
        patientFirstName VARCHAR(50)
    );
    
    INSERT INTO @T VALUES
    ('     Patient       '),
    ('     John          '),
    ('     Demo User     ');
    
    SELECT *
    FROM @T
    WHERE UPPER(REPLACE(patientFirstName, ' ', '')) = UPPER('demouser');
    

    如果您正在寻找其他列以及您只需要添加 OR 比如:

    WHERE UPPER(REPLACE(patientFirstName, ' ', '')) = UPPER('demouser')
    OR UPPER(REPLACE(patientMiddleName, ' ', '')) = UPPER('demouser')
    OR UPPER(REPLACE(patientLastName, ' ', '')) = UPPER('demouser');
    
        2
  •  0
  •   iSR5    7 年前

    你可以这样使用:

    SET @searchInput = 'demouser'
    SET @searchInput = LOWER(LTRIM(RTRIM(@searchInput)))
    
    
    SELECT *
    FROM (
    SELECT
        LTRIM(RTRIM(REPLACE([patientFirstName],' ','')))        patientFirstName
    ,   LTRIM(RTRIM(REPLACE([patientMiddleName],' ','')))   patientMiddleName
    ,   LTRIM(RTRIM(REPLACE([patientLastName],' ','')))     patientLastName
    ,   [startdate]
    ,   [enddate]
    FROM PatientDemoTable
    ) D
    WHERE
    ( 
            ISNULL(@searchInput,LOWER(patientFirstName))    = LOWER(patientFirstName)
        OR  ISNULL(@searchInput,LOWER(patientMiddleName))   = LOWER(patientMiddleName)
        OR  ISNULL(@searchInput,LOWER(patientLastName))     = LOWER(patientLastName)
    )
    AND 
    (
            ISNULL(@startTime, startdate) >= startdate
        AND ISNULL(@endTime, enddate) <= enddate
    )
    

    LTRIM() 以及 RTRIM() 只是为了消除空白,而 REPLACE() 也将删除任何空间。 LOWER() 将使所有字母大写(如果排序规则区分大小写,这只是数据库排序规则的一种变通方法)。

    这个 ISNULL() @searchInput 使用列数据,因此如果为NULL,它将带来所有数据(另一种方法是避免使用LIKE表达式)

        3
  •  0
  •   John Cappelletti    7 年前

    不可搜索,但应返回所需的结果

    ....
    WHERE (@startTime IS NULL OR startdate >= @startTime)
    AND   (@endTime   IS NULL OR enddate   <= @endTime)
    AND   charindex(@searchInput,replace(concat(patientFirstName,'-',patientMiddleName,'-',patientLastName),' ',''))>0
    

    注意 :的 '-' 是可选的,它们只是防止出血