SQL 通配符问题,奇怪的行为
SQL problem with wildcards, strange behaviour
我有这个查询:
SELECT Sites.Master_ID AS Master_ID, Scopes.Name AS Scope, Brands.Extension AS [Brand], Sites.ID AS [Site ID], Sites.Name AS [Site Name], Sites.Address, Sites.CAP, Sites.City, Countries.Name AS Country
From Sites
INNER Join Scopes ON Sites.scope_ID = Scopes.ID
INNER JOIN Brands ON Sites.brand_ID = Brands.ID
INNER Join Countries ON Sites.country_ID = Countries.ID
WHERE CONCAT (Scopes.Name, Brands.Extension, Sites.ID, Sites.Name, CONVERT(nvarchar(MAX),Sites.Address), Sites.CAP, Sites.City, Countries.Name) Like '%BA%'
这会产生以下结果:
[
而如果我删除 %,写 "Like 'BA%'"(而不是 '%BA%'),SELECT 是空的。
我真的不明白这是为什么。
在此先感谢您的帮助。
此致,
LIKE
模式匹配 整个 字符串。
因此,'%BA%'
在字符串中的任意位置查找 'BA'
。但是,'BA%'
只查找以 'BA'
开头的字符串。在您的情况下,这可能意味着 scopes.name
以 'BA'
.
开头
SQL 服务器支持 concat_ws()
的更新版本允许您执行以下操作:
WHERE CONCAT_WS('|', '|', Scopes.Name, Brands.Extension, . . .) Like '%|BA%'
这将检查每列是否以 'BA'
开头。这有点像黑客。明确一点可能更好:
WHERE Scopes.Name LIKE 'BA%' OR
Brands.Extension LIKE 'BA%' OR
. . .
或者也许:
WHERE 'BA' IN (LEFT(Scopes.Name, 2), LEFT(Brands.Extension, 2), . . .)
我有这个查询:
SELECT Sites.Master_ID AS Master_ID, Scopes.Name AS Scope, Brands.Extension AS [Brand], Sites.ID AS [Site ID], Sites.Name AS [Site Name], Sites.Address, Sites.CAP, Sites.City, Countries.Name AS Country
From Sites
INNER Join Scopes ON Sites.scope_ID = Scopes.ID
INNER JOIN Brands ON Sites.brand_ID = Brands.ID
INNER Join Countries ON Sites.country_ID = Countries.ID
WHERE CONCAT (Scopes.Name, Brands.Extension, Sites.ID, Sites.Name, CONVERT(nvarchar(MAX),Sites.Address), Sites.CAP, Sites.City, Countries.Name) Like '%BA%'
这会产生以下结果:
[
而如果我删除 %,写 "Like 'BA%'"(而不是 '%BA%'),SELECT 是空的。 我真的不明白这是为什么。
在此先感谢您的帮助。 此致,
LIKE
模式匹配 整个 字符串。
因此,'%BA%'
在字符串中的任意位置查找 'BA'
。但是,'BA%'
只查找以 'BA'
开头的字符串。在您的情况下,这可能意味着 scopes.name
以 'BA'
.
SQL 服务器支持 concat_ws()
的更新版本允许您执行以下操作:
WHERE CONCAT_WS('|', '|', Scopes.Name, Brands.Extension, . . .) Like '%|BA%'
这将检查每列是否以 'BA'
开头。这有点像黑客。明确一点可能更好:
WHERE Scopes.Name LIKE 'BA%' OR
Brands.Extension LIKE 'BA%' OR
. . .
或者也许:
WHERE 'BA' IN (LEFT(Scopes.Name, 2), LEFT(Brands.Extension, 2), . . .)