如何在SQL Server中使用多个CHARINDEX函数?

时间:2018-07-11 12:47:32

标签: sql-server

我有以下代码,它将提取逗号(“,”)之前的字符串:

SELECT LTRIM(LEFT(@Adresa, CHARINDEX(',', @Adresa)-1))

有时,逗号(',')不是我需要照顾的字符,因为它可能会丢失。有什么方法可以适应此查询,以便查找逗号和未找到逗号的另一个值?如果找到它,请完成该语句,而不要照顾下一个。谢谢!

修改

要评估的文字:我的地址,否。 23.

在某些情况下,用户错误会丢失逗号,并且上面的代码给我一个错误。如果缺少逗号,我想继续尝试找到“否”。

3 个答案:

答案 0 :(得分:2)

这不是特别优雅,但是CASE语句将让您尝试尽可能多的选项。只需继续添加WHEN。命中的第一个将返回您的结果。

DECLARE @t TABLE (Adresa VARCHAR(50));
INSERT @t
  (
    Adresa
  )
VALUES
  ('My Address, no. 23'), --With comma
  ('My Address2 no. 23'); --No comma

SELECT
  CASE 
    WHEN CHARINDEX(',', Adresa) > 0
      THEN LTRIM(LEFT(Adresa, CHARINDEX(',', Adresa)-1))
    WHEN CHARINDEX('no.', Adresa) >0
      THEN LTRIM(LEFT(Adresa, CHARINDEX('no.', Adresa)-1))
    ELSE Adresa
  END AS TestString
FROM @t

Results:
+--------------+
|  TestString  |
+--------------+
| My Address   |
| My Address2  |
+--------------+

答案 1 :(得分:1)

DECLARE @Adresa VARCHAR(50) ='My Address, no. 23',
@org_len INT,
@check_len INT,
@Adresa_OUTPUT VARCHAR(50)

SET @org_len = (SELECT LEN(@Adresa))
SET @check_len = (SELECT LEN(SUBSTRING(@Adresa, CHARINDEX(',', @Adresa) + 1, LEN(@Adresa))))

IF @org_len <> @check_len
BEGIN
    SET @Adresa_OUTPUT =(SELECT SUBSTRING(@Adresa,0,CHARINDEX(',',@Adresa,0)))
END
ELSE
BEGIN
    SET @Adresa_OUTPUT = (SELECT SUBSTRING(@Adresa,0,CHARINDEX('.',@Adresa,0)))
    SET @Adresa_OUTPUT = ( SELECT REVERSE(RIGHT(REVERSE (@Adresa_OUTPUT), len(@Adresa_OUTPUT) - NULLIF(charindex(' ', REVERSE(@Adresa_OUTPUT)),0))))
END
SELECT @Adresa_OUTPUT

答案 2 :(得分:1)

据我了解,您需要返回no.之前的所有字符,然后删除,(如果存在) 使用下一个查询:-

select Replace((left(@Adresa, charindex('no.', @Adresa) - 2)),',','')