LIKE 条件的隐式排序是什么?

Luc*_*ucy -2 sql-server like

我想知道LIKE运算符是如何分类的,我有一个查询,其中有许多链式LIKE语句。以下结果在返回时如何优先排序?

AND (
  ic.COLUMN_NAME like '%Address%'
  OR ic.COLUMN_NAME like '%Email%' 
  OR ic.COLUMN_NAME like '%Phone%' 
  OR ic.COLUMN_NAME like '%Bank%'
  OR ic.COLUMN_NAME like '%Number%'
  OR ic.COLUMN_NAME like '%NAME%'   
  OR ic.COLUMN_NAME like '%Postcode%'   
Run Code Online (Sandbox Code Playgroud)

只是为了补充说明,因为我认为有些人可能没有完全理解我的问题,我将举一个例子:

假设我正在寻找地址(而不是电子邮件)并且我使用以下语句:

select * from INFORMATION_SCHEMA.COLUMNS IC
    where ic.COLUMN_NAME like '%Address%' 
Run Code Online (Sandbox Code Playgroud)

这是我要回来的:

在此处输入图片说明

我用下面的代码做同样的事情:

select * from INFORMATION_SCHEMA.COLUMNS IC
    where ic.COLUMN_NAME like '%Email%' 
    --OR ic.COLUMN_NAME like '%Email%'
Run Code Online (Sandbox Code Playgroud)

然后我得到这个:

在此处输入图片说明

这意味着在第一种情况下,我将取回地址和电子邮件地址。我知道它们只是字符串,但是我如何才能搜索地址而不取回电子邮件地址,例如email_address1address_email1web_Address_email等。我不想使用 ,where Column_Name = 'Address'因为这意味着我会错过不同的名称,例如地址 1地址 2

Han*_*non 6

INFORMATION_SCHEMA您应该使用 SQL Server 视图,而不是使用对象,例如sys.objects.

例如:

SELECT s.name
    , o.name
    , c.name
FROM sys.schemas s
    INNER JOIN sys.objects o ON s.schema_id = o.schema_id
    INNER JOIN sys.columns c ON o.object_id = c.object_id
WHERE c.name LIKE 'Address%'
    OR c.name LIKE 'Email%';
Run Code Online (Sandbox Code Playgroud)

请注意WHERE上面的条款,我有LIKE 'Address%' OR LIKE 'Email%'?这是一个逻辑 OR 操作,其中列名可以是任何以地址或电子邮件开头的内容。

如果您创建一个简单的表:

CREATE TABLE dbo.SomeTable
(
    AddressLine1 varchar(100) NOT NULL
    , EmailAddress varchar(256) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

并运行上面的查询,您会看到以下结果:

???????????????????????????????????????
? 姓名 ?姓名 ?姓名 ?
???????????????????????????????????????
? 德博?一些表?地址第一行 ?
? 德博?一些表?电子邮件地址 ?
???????????????????????????????????????

LIKE 将一个字符串的内容与另一个字符串进行匹配,通常使用通配符来匹配任何未知的字符组合。

因此,例如,如果您有一列包含以下数据:

?????????
? 水果 ?
?????????
? 橘子 ?
? 苹果 ?
? 葡萄?
? 香蕉 ?
? 梨 ?
?????????

然后你LIKE对它进行比较:

WHERE fruit LIKE '%ap%'
Run Code Online (Sandbox Code Playgroud)

您将获得以下行列出:

?????????
? 水果 ?
?????????
? 苹果 ?
? 葡萄?
?????????

如果您只需要列值以“apple”开头的行,则需要使用:

WHERE fruit LIKE 'apple%'
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,通配符 ,%仅出现在单词 的末尾apple,表示我们将接受以开头的 匹配项apple

如果我们运行这个:

WHERE fruit = 'apple'
Run Code Online (Sandbox Code Playgroud)

我们得到整个列值等于 的行apple

如果您想要包含两个字母的所有结果ap,但您想排除grape,您可以这样做:

WHERE fruit LIKE '%ap%' 
    AND fruit <> 'grape'
Run Code Online (Sandbox Code Playgroud)

如果您想要ap单词中任何位置的所有数据,但没有以 开头gra,您可以这样做:

WHERE fruit LIKE '%ap%'
    AND NOT (fruit LIKE 'gra%')
Run Code Online (Sandbox Code Playgroud)

LIKE运营商不优先考虑它的结果。它只是返回与结果匹配的所有行。

来自T-SQL LIKE 运算符Microsoft Docs

确定特定字符串是否与指定模式匹配。模式可以包括常规字符和通配符。在模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配。但是,通配符可以与字符串的任意片段匹配。使用通配符使 LIKE 运算符比使用 = 和 != 字符串比较运算符更灵活。