zoukankan      html  css  js  c++  java
  • WQL

    查询 WHERE 子句中的值

    编写 WQL 查询时,通常查找的是完整的值。例如,如果想返回计算机上名称为 SCRIPTS 的所有文件夹的集合,则需要使用与以下内容类似的查询:

     

    "SELECT * FROM WIN32_DIRECTORY WHERE FILENAME = 'SCRIPTS'"

     

    不过,有时您关注的是部分值而不是完整值,此时需要进行某种模式匹配。例如,假设有一组名称与以下内容类似的文件夹:

     

    SCRIPTS-1

    SCRIPTS-2

    SCRIPTS-3

    SCRIPTS-4

     

    您清楚地知道自己想要做什么:您想要返回一个集合,其中包含名称以字符 SCRIPTS- 开头(连字号后可能有某个其他字符或一组字符)的所有文件夹。在 WINDOWS 2000 中,无法编写能够进行这种模式匹配的查询。您只能返回文件系统中所有文件夹的集合(这本身可能就是一个很漫长的过程),然后检查每个文件夹名称,看其是否与模式匹配。例如:

     

    IF (LEFT, OBJFOLDER.FILENAME, 8) = "SCRIPTS-" THEN

     

    这种方法虽然有效,但无疑速度很慢,并且也不够巧妙。

     

    LIKE 运算符简介

    这正是 LIKE 运算符可以发挥作用的地方。可以使用 LIKE 运算符(同样只能在 WINDOWS SERVER 2003 WINDOWS XP 中使用)在查询中包含模式匹配。想要返回一个由名称以字符 SCRIPTS- 开头的所有文件夹组成的集合吗?请使用以下查询:

     

    "SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'SCRIPTS-%'"

     

    我们稍后会说明该查询的工作方式。暂时可以这样讲,查询的内容基本上可以反映它的工作方式:显示 FILENAME 属性值类似于 SCRIPTS- 的所有文件夹的列表。为什么不干脆说“...FILENAME 属性的值是‘SCRIPTS-’...”呢?如果这样做的话,将只返回实际名称是“SCRIPTS-”的文件夹。我们想要的不是名称本身就是“SCRIPTS-”的文件夹,而是名称与之类似的文件夹。这就是我们使用 LIKE 运算符而不是等号的原因。

    不要担心:我们会阐述如何在脚本中使用 LIKE 运算符。何时开始阐述?现在就开始如何?

     

    使用通配符

    LIKE 查询中最常用的字符可能就是 % 字符。% 字符的作用与命令外壳程序中使用的 * 通配符非常相似。例如,假设要列出文件名以字母 X 开头的所有文件。在命令提示符中键入以下内容并按 ENTER 键,即可实现该目的:

     

    DIR X*

     

    要列出以 X 结尾的所有文件名,请键入以下内容并按 ENTER 键:

     

    DIR *X

     

    最后一种情况,要列出文件名中的某个位置包含字母 X 的所有文件,请键入以下内容并按 ENTER 键:

     

    DIR *X*

     

    对您而言,以上内容多半是老调重弹,因为大多数系统管理员都知道 *(至少在 DIR 命令中使用时)是一个通配符,表示任意字符或一组字符。例如,可以像下面这样解释命令“DIR *X*”显示名称以任意字符(哪个字符都可以)开头、名称中的某个位置包含字符 X 并且以任意字符结尾的所有文件。同样,命令“DIR X*”的意思就是显示名称以 X 开头,其后可以是任意字符(也可以没有任何字符)的所有文件。就是显示那些以 X 开头的文件

    您是说对上述内容全都了解吗?好极了,这样在编写使用 LIKE 运算符的查询时就轻松多了。

     

    创建开头为查询

    WQL LIKE 查询中,% 的作用与 * 非常类似。例如,假设要列出名称以字母 X 开头的所有文件夹。以下就是用于完成此操作的脚本:

     

    STRCOMPUTER = "."

    SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

     

    SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

        ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'X%'")

     

    FOR EACH OBJFOLDER IN COLFOLDERS

        WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

    NEXT

     

    请注意 WQL 查询和 WHERE 子句的结构,尤其是要注意 WHERE 子句的结构:

     

    "SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'X%'"

     

    我们想要达到的目的是:显示 FILENAME 属性以字母 X 开头的所有文件夹的列表。就是这样,与命令“DIR X*”非常相似。我们只是使用了 LIKE 运算符,并指定了文件名“X%”。还要注意,% 字符包含在单引号内;必须将通配符当作是文件夹名称本身的实际组成部分。

     

    创建结尾为查询

    以下是另一个示例。在此示例中,我们调换了 % 字符与字母 X 的位置:

     

    "SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '%X'"

     

    这是什么意思?它的含义是,现在我们要查找以 X 结尾的文件夹名称。我们不关心字母 X(也就是 % 字符)前面有哪些字符(或是否有字符);我们只关心最后一个字母恰好是 X

    以下是完整的脚本,它返回名称以 X 结尾的所有文件夹:

     

    STRCOMPUTER = "."

    SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

     

    SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

        ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '%X'")

     

    FOR EACH OBJFOLDER IN COLFOLDERS

        WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

    NEXT

     

     

    创建包含查询

    又一个脚本。此脚本查找文件夹名称中的任意位置包含字母 X 的文件夹,这就是将字母 X 夹在两个 % 字符间的原因。我们不关心字母 X 前有哪些字符,也不关心字母 X 后有哪些字符。我们所要做的就是在文件夹名称中查找字母 X

     

    STRCOMPUTER = "."

    SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

     

    SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

        ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '%X%'")

     

    FOR EACH OBJFOLDER IN COLFOLDERS

        WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

    NEXT

     

    当然,并不仅限于在查询中只使用一个字母。例如,要列出文件夹名称中包含 APRIL 一词的所有文件夹,请使用以下查询:

     

    "SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '%APRIL%'"

     

     

    使用一组字符

    您会说,不错,已经相当好了。但假设您想获得名称以字母 X、字母 Y 或字母 Z 开头的所有文件夹的集合,是否只能使用各种 OR 运算符来编写查询(如下所示)?

     

    "SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'X%' OR FILENAME LIKE 'Y%' OR FILENAME LIKE 'Z%'"

     

    不必如此。可以将这些字符括在方括号内来指定一组字符:[]。例如,如果要列出名称以 X Y Z 开头的文件夹,请使用以下查询:

     

    "SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '[XYZ]%'"

     

    在以上查询中,将三个目标字符“XYZ”括在方括号内;此外,方括号(及括号内的字符)都位于单引号内。还要注意,此结构 - [XYZ] - 的处理方式与任何其他字符完全一样。在上一查询中,字母 X 后跟 % 字符:‘X%’。在此查询中,[XYZ] 字符后跟百分号字符:‘[XYZ]%’。运行一下完整的脚本,看看效果如何:

     

    STRCOMPUTER = "."

    SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

     

    SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

        ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '[XYZ]%'")

     

    FOR EACH OBJFOLDER IN COLFOLDERS

        WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

    NEXT

     

     

    创建例外查询

    您说以上内容仍未正中下怀,这是何意?噢,一定是了:您想要检索的是名称不是以字母 XY Z 开头的所有文件夹的集合。您猜怎么样?事实证明,使用 LIKE 查询就可以完成此项任务。您所要做的就是使用刚才示范的方法,即将所需字符集置于方括号内。不过,这一次要在这些字符前添加脱字号:^。脱字号指示脚本检索方括号内包含的字符以外的所有内容。要返回名称不是以 XY Z 开头的所有文件夹,只需使用以下查询:

     

    "SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '[^XYZ]%'"

     

    以下是用来执行该任务的完整脚本:

     

    STRCOMPUTER = "."

    SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

     

    SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

        ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE '[^XYZ]%'")

     

    FOR EACH OBJFOLDER IN COLFOLDERS

        WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

    NEXT

     

    是的:很酷。现在轮到最后一个查询了,看上去有点古怪,不过您可能会发现它非常有用。

     

    使用单字符通配符

    假设有一组名称与以下内容类似的文件夹:

     

    B010105X

    B010205X

    B010305X

    B010405X

     

    换言之,每个文件夹名称均以字母 B 开头,然后是表示日期的六位数字(010105 表示 2005 1 1 日),最后是字母 X。多半没有办法编写一个查询来返回所有这些文件夹的列表,不是吗?

    是啊,几乎无法做到。事实证明,可以使用下划线 (_) 来表示字符串中的任何单个字符。文件夹名称中的第一个字符已知:B。文件夹名称中的最后一个字母已知:X。我们还知道 B X 间有六个字符,只是不能确定地知道这六个字符是什么。但那没有关系:我们使用与以下内容类似的查询就可以了,它使用六个下划线来表示六个未知字符:

     

    "SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'B______X'"

     

    是的,我们知道它看上去怪怪的;我们可是告诉过您它的样子有点古怪。不过效果蛮好。以下是完整的脚本,可以自己试着运行一下:

     

    STRCOMPUTER = "."

    SET OBJWMISERVICE = GETOBJECT("WINMGMTS:\\" & STRCOMPUTER & "\ROOT\CIMV2")

     

    SET COLFOLDERS = OBJWMISERVICE.EXECQUERY _

        ("SELECT * FROM WIN32_DIRECTORY WHERE FILENAME LIKE 'B______X'")

     

    FOR EACH OBJFOLDER IN COLFOLDERS

        WSCRIPT.ECHO "NAME: " & OBJFOLDER.FILENAME

    NEXT

     

    请注意,此类查询的运行速度相对较慢,查找字符串中的字符的任何查询都有这个缺点。(查找字符串开头或结尾处通配符的查询的运行速度要快得多。)尽管如此,查询效果很好,它将返回所有 B______X 文件夹的集合。最惬意的是,下次有人问你您为何要升级到 WINDOWS SERVER 2003?有什么是 2003 可以做到而 WINDOWS 2000 做不到的吗?,想象一下,当您向他们展示这个脚本时,您会有多么得意!

     

  • 相关阅读:
    【贪心】【堆】Gym
    【并查集】Gym
    【拓扑排序】【bitset】Gym
    【递归】【线段树】【堆】AtCoder Regular Contest 080 E
    【二分图】【并查集】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem L. Canonical duel
    【动态规划】【滚动数组】【bitset】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem J. Terminal
    【二分】【字符串哈希】【二分图最大匹配】【最大流】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem I. Minimum Prefix
    【枚举】【最小表示法】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem F. Matrix Game
    【推导】【构造】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem E. Space Tourists
    【推导】【贪心】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem D. Clones and Treasures
  • 原文地址:https://www.cnblogs.com/ahuo/p/2303171.html
Copyright © 2011-2022 走看看