从SELECT LIKE

时间:2017-12-01 01:25:14

标签: sql-server

伙计们,

我在显示来自字段的数据时遇到问题,该字段包含以分号分隔的多个名称。我的客户想要一个名称与搜索条件匹配的显示,如下面的示例:

   Fields
   Domain                    Names                 
   ---------------------------------------------------------
   England                   Alice;Bob;Carl;David;Elton

我需要的是,使用以下查询:

   select * from database where Names like 'a%'

获取

   England                   Alice;Carl;David

甚至

   select * from database where Names like 'Da%'

获取

   England                   David

并使用

   select * from database where Names like '%'

获取

   England                   Alice;Bob;Carl;David;Elton

我正在研究MS-SQL 2012,我有一个StoredProcedure来获取所选行,但每次我得到的结果都像上面/最后一行:所有名称。

如何按照委托标准对所定位的字符串进行hilite /显示?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这些名称的第一件事就是“拆分”然后分成单独的行,然后你可以单独搜索它们。 T-SQL有无数的“分裂字符串”功能,所以我不打算提供一个使用哪一个论文。例如Split strings the right way – or the next best way(Aaron Bertrand)

以下是一种可以满足小(ish)要求的方法:

Demo at SQL Fiddle

CREATE TABLE Table1 ([Domain] varchar(7), [Names] varchar(26)) ;

INSERT INTO Table1 ([Domain], [Names])
VALUES ('England', 'Alice;Bob;Carl;David;Elton') ;

<强>查询

select
    t.Domain
  , split.value('.', 'varchar(50)') as [Name]
from Table1 t
cross apply (
    select cast('<r>'+replace(Names, ';', '</r><r>')+'</r>' as xml)
    ) as ca1(split1)
cross apply split1.nodes('r') as ca2 (split)

<强> Results

|  Domain |  Name |
|---------|-------|
| England | Alice |
| England |   Bob |
| England |  Carl |
| England | David |
| England | Elton |

以这种方式获得行后,很容易找到符合条件的行。一旦你完成了那个(如果需要的话),就可以再次使用“for xml path”将这些名称组合回一个单独的字符串中(并且有许多如何使用它的例子)。见How Stuff and 'For Xml Path' work in Sql Server