检查列是否包含模式?

时间:2012-04-17 11:46:14

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

enter image description here

我正在编写一个查询,以便在以下查询中从user_name_n列获取fname我正在使用pathindex查找空格'% %'将该pathindex返回值传递给left 它工作正常,但我用,记录了如何编写查询 这也将照顾,

Bellian之类的某些记录没有space or ,,但我仍然希望它们在fname中 但它不适用于以下查询。

SELECT top 100 user_name_n,left(user_name_n,(patindex('% %',user_name_n)))
from SFCHA10_04_02_2012;

任何人都可以告诉我如何才能达到预期的效果。

3 个答案:

答案 0 :(得分:2)

Select user_name_n,
       left(user_name_n,patindex('%[, ]%',user_name_n + ' ')-1)
From   SFCHA10_04_02_2012;

请注意,您可以使用'%[,]%'来搜索空格或逗号。另请注意,我在第二个参数中添加了+''。即使数据不包含空格,也会导致匹配。

答案 1 :(得分:1)

SELECT TOP (100) user_name_n,
    SUBSTRING(
        user_name_n,
        COALESCE(CHARINDEX(',',user_name_n)+1,1), 
        COALESCE(NULLIF(CHARINDEX(' ',user_name_n),0),255))
from SFCHA10_04_02_2012;

如果您希望使用lname,fname形式的逗号(不知道为什么会出现这种奇怪的要求)时使用姓氏而不是名字,那么:

SELECT TOP (100) user_name_n,
    SUBSTRING(user_name_n, 1, 
  COALESCE(NULLIF(CHARINDEX(',',user_name_n)-1,-1),
        NULLIF(CHARINDEX(' ',user_name_n),0),255))
from SFCHA10_04_02_2012;

答案 2 :(得分:0)

所以首先你要在CTE上用白色空间替换昏迷和圆点 并且你从一开始到第一次出现一个空格(或整个长度,如果没有空格)切割名称:

with aux_query as(
select 
replace(REPLACE(user_name_n,',',' '),'.',' ')  as name
from SFCHA10_04_02_2012
)
select SUBSTRING (name,1, case CHARINDEX(' ',name) when null then LEN(name) else LEN(name) end)
from aux_query