Reference > Functions > String
PatIndex
- 2005
- 2008
- 2012
- 2014
- 2016
- 2017
- 2019
- 2022
- 2005, 2008, 2012, 2014, 2016, 2017, 2019, 2022
PatIndex (Pattern Index) String Function
Use the PatIndex function to search for the starting position of a pattern in a string expression or zero if the pattern is not found in the string expression.
Syntax
db.fx.PatIndex({pattern}, {expression})
Arguments
- pattern
- – The value to search for in `expression`.
- expression
- – The element to search for `pattern`.
Returns
long or long?
dbExpression does not include or append any wildcard characters with the provided pattern - it is up to you to provide the wildcard characters.
Microsoft SQL Server returns bigint if expression is of the varchar(max), varbinary(max), or nvarchar(max) data types; otherwise, int. dbExpression generally maps these to CLR types long and int respectively. As the dbExpression implementation for PatIndex works with the CLR type string, there is no way to effect a different return type based on the length of the provided string for the expression method parameter. Therefore, PatIndex in dbExpression always returns long or long?.
Examples
Select Statement
Select the index of an occurrence of the state in the city name.
IEnumerable<long> result = db.SelectMany(
db.fx.PatIndex("%" + dbo.Address.State + "%", dbo.Address.City)
)
.From(dbo.Address)
.Execute();
Where Clause
Select a list of address ids where the value of city is equal to the value of line 1 (a wildcard token has not been added to the beginning or the end of 'dbo.Address.Line1', so PatIndex will return 1 only if the city exactly matches the line 1 of address).
IEnumerable<int> result = db.SelectMany(
dbo.Address.Id
)
.From(dbo.Address)
.Where(db.fx.PatIndex(dbo.Address.Line1, dbo.Address.City) == 1)
.Execute();
Order By Clause
Select a list of addresses, ordered by the index of the occurrence of line2 in line1.
IEnumerable<Address> addresses = db.SelectMany<Address>()
.From(dbo.Address)
.OrderBy(db.fx.PatIndex("%" + dbo.Address.State + "%", dbo.Address.City))
.Execute();
Group By Clause
Select a list of address values grouped by address type and the index of line2 in line1.
IEnumerable<dynamic> values = db.SelectMany(
db.fx.Count().As("count"),
dbo.Address.AddressType
)
.From(dbo.Address)
.GroupBy(
dbo.Address.AddressType,
db.fx.PatIndex("%" + dbo.Address.State + "%", dbo.Address.City)
)
.Execute();
Having Clause
Select a the count of addresses grouped by address type and the index of state in line1 where the value of state appears in line1.
IEnumerable<dynamic> values = db.SelectMany(
db.fx.Count().As("count"),
dbo.Address.AddressType
)
.From(dbo.Address)
.GroupBy(
dbo.Address.AddressType,
db.fx.PatIndex("%" + dbo.Address.State + "%", dbo.Address.Line1)
)
.Having(
db.fx.PatIndex("%" + dbo.Address.State + "%", dbo.Address.Line1) > 0
)
.Execute();
