Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中,如何使用LIKE子句及其通配符函数组合成一个条件/参数?_Sql_Sql Server - Fatal编程技术网

在SQL中,如何使用LIKE子句及其通配符函数组合成一个条件/参数?

在SQL中,如何使用LIKE子句及其通配符函数组合成一个条件/参数?,sql,sql-server,Sql,Sql Server,我正在尝试使用LIKE子句及其通配符函数(%,u,^,[…)过滤Sql Server中的代码 我的名单如下: A11111 A11111B A1112K A1114AFR A111GCAS A111HIV A71111 AF1111 AQ1111 AT1111 AY1111 AZ11EGWHI AZ11MEDIA AZ2111 AZ3111 AZ4111 AZA111 AZB111 AZC111 AZI1111 AZM111 AZN111 AZN1AD AZO111 AZP111 AZS111

我正在尝试使用LIKE子句及其通配符函数(%,u,^,[…)过滤Sql Server中的代码

我的名单如下:

A11111
A11111B
A1112K
A1114AFR
A111GCAS
A111HIV
A71111
AF1111
AQ1111
AT1111
AY1111
AZ11EGWHI
AZ11MEDIA
AZ2111
AZ3111
AZ4111
AZA111
AZB111
AZC111
AZI1111
AZM111
AZN111
AZN1AD
AZO111
AZP111
AZS111
AZU111
AZXT11
AZXT11B
我想排除:

  • 任何以“AZ”开头的
  • 以及以“A11111”开头的任何内容
  • 我知道Sql代码的工作方式如下:

    SELECT ACNT_CODE
    FROM DB
    WHERE (DB.ACNT_CODE NOT LIKE 'A[Z]%' AND DB.ACNT_CODE NOT LIKE 'A11111%')
    
    但是我需要Where子句仅在一个条件中组合 像这样:

    SELECT ACNT_CODE
    FROM DB
    WHERE (DB.ACNT_CODE NOT LIKE 'A[1Z]%')
    
    --->然而,当我使用它时,它仍然包括以A1xxx开始的任何内容,而不完全是A11111%

    --->挑战是我只能使用(01)一个条件,而不能使用(02)和组合的两个条件。[这是因为我们正在使用一个旧程序,我必须遵守:(]

    最后,我的结果将是:

    A1112K
    A1114AFR
    A111GCAS
    A111HIV
    A71111
    AF1111
    AQ1111
    AT1111
    AY1111
    
    那么,有什么想法吗

    好的,我正在使用Vision Q&A Executive设计报告。不幸的是,程序中唯一允许的标准是一行。如果我添加了另一行具有相同参数,它会将其更改为“或”而不再,因此无法满足结果

    因此,使用或然后

    SELECT ACNT_CODE
    FROM DB
    WHERE DB.ACNT_CODE LIKE '[B-Z]%'
    OR    DB.ACNT_CODE LIKE '[0-9]%'
    OR    DB.ACNT_CODE LIKE 'A[A-Y]%'
    OR    DB.ACNT_CODE LIKE 'A0%''
    OR    DB.ACNT_CODE LIKE 'A10%''
    OR    DB.ACNT_CODE LIKE 'A1[2-9]%'
    OR    DB.ACNT_CODE LIKE 'A110%''
    OR    DB.ACNT_CODE LIKE 'A111[2-9]%'
    OR    DB.ACNT_CODE LIKE 'A1110%''
    OR    DB.ACNT_CODE LIKE 'A1111[2-9]%'
    OR    DB.ACNT_CODE LIKE 'A11110%''
    OR    DB.ACNT_CODE LIKE 'A11111[2-9]%'
    
    好的,我正在使用Vision Q&A Executive设计报告。不幸的是,程序中唯一允许的标准是一行。如果我添加了另一行具有相同参数,它会将其更改为“或”而不再,因此无法满足结果

    因此,使用或然后

    SELECT ACNT_CODE
    FROM DB
    WHERE DB.ACNT_CODE LIKE '[B-Z]%'
    OR    DB.ACNT_CODE LIKE '[0-9]%'
    OR    DB.ACNT_CODE LIKE 'A[A-Y]%'
    OR    DB.ACNT_CODE LIKE 'A0%''
    OR    DB.ACNT_CODE LIKE 'A10%''
    OR    DB.ACNT_CODE LIKE 'A1[2-9]%'
    OR    DB.ACNT_CODE LIKE 'A110%''
    OR    DB.ACNT_CODE LIKE 'A111[2-9]%'
    OR    DB.ACNT_CODE LIKE 'A1110%''
    OR    DB.ACNT_CODE LIKE 'A1111[2-9]%'
    OR    DB.ACNT_CODE LIKE 'A11110%''
    OR    DB.ACNT_CODE LIKE 'A11111[2-9]%'
    

    你可以颠倒逻辑,得到允许的结果。我相信这是正确的逻辑:

    WHERE DB.ACNT_CODE LIKE '[^A]%' OR
          DB.ACNT_CODE LIKE 'A[^Z1]%' OR
          DB.ACNT_CODE LIKE 'A1[^1]%' OR
          DB.ACNT_CODE LIKE 'A11[^1]%' OR
          DB.ACNT_CODE LIKE 'A111[^1]%' OR
          DB.ACNT_CODE LIKE 'A1111[^1]%'
    

    你可以颠倒逻辑,得到允许的结果。我相信这是正确的逻辑:

    WHERE DB.ACNT_CODE LIKE '[^A]%' OR
          DB.ACNT_CODE LIKE 'A[^Z1]%' OR
          DB.ACNT_CODE LIKE 'A1[^1]%' OR
          DB.ACNT_CODE LIKE 'A11[^1]%' OR
          DB.ACNT_CODE LIKE 'A111[^1]%' OR
          DB.ACNT_CODE LIKE 'A1111[^1]%'
    

    非常感谢您提出的所有建议和回答,我非常感谢。但由于我需要的是一个带有LIKE的单一条件,因此如果解决方案不止一行,那么它将无法与软件一起工作

    然而,我找到了一个解决办法,让它在一行中满足我的要求,但我不得不在当前列表中添加另一列:

    - ACNT_CODE -  - TYPE -
    A11111         ACHIGH01
    A11111B       ACHIGH01
    A1112K        ACOTHER01
    A1114AFR      ACOTHER01
    A111GCAS      ACOTHER01
    A111HIV       ACOTHER01
    A71111        ACOTHER01
    AF1111        ACOTHER01
    AQ1111        ACOTHER01
    AT1111        ACOTHER01
    AY1111        ACOTHER01
    AZ11EGWHI     ACLOWER01
    AZ11MEDIA     ACLOWER01
    AZ2111        ACLOWER01
    AZ3111        ACLOWER01
    AZ4111        ACLOWER01
    AZA111        ACLOWER01
    AZB111        ACLOWER01
    AZC111        ACLOWER01
    AZI1111       ACLOWER01
    AZM111        ACLOWER01
    AZN111        ACLOWER01
    AZN1AD        ACLOWER01
    AZO111        ACLOWER01
    AZP111        ACLOWER01
    AZS111        ACLOWER01
    AZU111        ACLOWER01
    AZXT11        ACLOWER01
    AZXT11B       ACLOWER01
    
    然后在我的SQL中,我对单个条件使用相同的LIKE,如下所示:

    SELECT ACNT_CODE
    FROM DB
    WHERE (DB.TYPE NOT LIKE 'AC[HL]%') --Excluse ACHIGH01 & ACLOWER01
    
    或者更简单一点:

    SELECT ACNT_CODE
    FROM DB
    WHERE (DB.TYPE LIKE 'AC[O]%') --Include only ACOTHER01
    
    它与
    WHERE(DB.TYPE,如'AC[ˆHL]')相同——不包括ACHIGH01和ACLOWER01

    当然,最终的结果是:

    A1112K
    A1114AFR
    A111GCAS
    A111HIV
    A71111
    AF1111
    AQ1111
    AT1111
    AY1111
    

    但是,出于SQL搜索和学习的目的,如果其他人在没有其他列的情况下找到更好的,我会将此问题留待讨论。

    非常感谢您的所有建议和答案,我对此表示感谢。但由于我需要的是一个带有LIKE的单一条件,因此如果解决方案不止一行,那么嗯,这个软件不行

    然而,我找到了一个解决办法,让它在一行中满足我的要求,但我不得不在当前列表中添加另一列:

    - ACNT_CODE -  - TYPE -
    A11111         ACHIGH01
    A11111B       ACHIGH01
    A1112K        ACOTHER01
    A1114AFR      ACOTHER01
    A111GCAS      ACOTHER01
    A111HIV       ACOTHER01
    A71111        ACOTHER01
    AF1111        ACOTHER01
    AQ1111        ACOTHER01
    AT1111        ACOTHER01
    AY1111        ACOTHER01
    AZ11EGWHI     ACLOWER01
    AZ11MEDIA     ACLOWER01
    AZ2111        ACLOWER01
    AZ3111        ACLOWER01
    AZ4111        ACLOWER01
    AZA111        ACLOWER01
    AZB111        ACLOWER01
    AZC111        ACLOWER01
    AZI1111       ACLOWER01
    AZM111        ACLOWER01
    AZN111        ACLOWER01
    AZN1AD        ACLOWER01
    AZO111        ACLOWER01
    AZP111        ACLOWER01
    AZS111        ACLOWER01
    AZU111        ACLOWER01
    AZXT11        ACLOWER01
    AZXT11B       ACLOWER01
    
    然后在我的SQL中,我对单个条件使用相同的LIKE,如下所示:

    SELECT ACNT_CODE
    FROM DB
    WHERE (DB.TYPE NOT LIKE 'AC[HL]%') --Excluse ACHIGH01 & ACLOWER01
    
    或者更简单一点:

    SELECT ACNT_CODE
    FROM DB
    WHERE (DB.TYPE LIKE 'AC[O]%') --Include only ACOTHER01
    
    它与
    WHERE(DB.TYPE,如'AC[ˆHL]')相同——不包括ACHIGH01和ACLOWER01

    当然,最终的结果是:

    A1112K
    A1114AFR
    A111GCAS
    A111HIV
    A71111
    AF1111
    AQ1111
    AT1111
    AY1111
    

    但是,出于SQL搜索和学习的目的,如果其他人在没有其他列的情况下找到更好的条件,我会始终保留此问题。

    “挑战是我只能使用(01)一个条件,而不能使用(02)和组合的两个条件”为什么?我使用的是一个非常旧的程序。只接受使用1个LIKE的1个条件。如果我添加第二个LIKE,则它使用OR,但不使用更多。在条件中,您为什么删除了示例表数据和预期结果?(请注意,这里的大多数人想要格式化的文本,而不是图像。)我已经为您回滚了编辑。如果您想添加以前的额外位,请将它们添加到我们现有的信息之外,因为删除示例数据和预期结果会对问题造成巨大损害。另一方面,这里的问题似乎是您的遗留程序,而不是SQL;您最好询问您正在使用的应用程序以及如何让它接受
    中的多个子句,其中
    “挑战是我只能使用(01)一个条件,而不是(02)和组合的两个条件”为什么?我使用的是一个非常旧的程序。只接受使用1个LIKE的1个条件。如果我添加第二个LIKE,则它使用OR,但不使用更多。在条件中,您为什么删除了示例表数据和预期结果?(请注意,这里的大多数人想要格式化的文本,而不是图像。)我已经为您回滚了编辑。如果您想添加以前的额外位,请将它们添加到我们现有的信息之外,因为删除示例数据和预期结果会对问题造成巨大损害。另一方面,这里的问题似乎是您的遗留程序,而不是SQL;您最好询问您正在使用的应用程序以及如何让它接受
    WHERE
    中的多个子句。感谢@GordonLinoff的尝试。但是第一个筛选器拒绝
    中的所有内容[^A]%“
    第二个过滤器甚至会拒绝以A1开头但不完全是A11111或A1的部分所需结果A11111B@Tsiriniaina…这些字符串是通过
    连接的。第一个字符串返回所有不以A开头的字符串--所有这些似乎都可以接受。第二个字符串不以AZ或A1开头--所有这些字符串都是ac可接受。等等。感谢@GordonLinoff的尝试。但是第一个筛选器拒绝了所有
    “[^A]%“
    第二个过滤器甚至会拒绝以A1开头但不完全是A11111或A1的部分所需结果A11111B@Tsiriniaina…这些字符串是通过
    连接的。第一个字符串返回所有不以A开头的字符串--所有这些似乎都可以接受。第二个字符串不以AZ或A1开头--所有这些字符串都是ac可接受的。等等。如果要求不是关于单一条件,那么我会有se