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

时间:2019-06-05 07:54:11

标签: sql sql-server

我正在尝试使用 LIKE子句及其通配符函数(%,_,^,[] ...)

过滤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

我想排除:

  1. 任何以“ AZ”开头的
  2. 以及所有完全以“ 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)两个条件由AND组合。 [这是由于我们使用的是旧程序,并且我必须遵守:(]

最后,我的结果应该是这样:

A1112K
A1114AFR
A111GCAS
A111HIV
A71111
AF1111
AQ1111
AT1111
AY1111

那么,有什么想法吗?

3 个答案:

答案 0 :(得分:1)

  

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

然后使用OR。

        do
        {
       Console.WriteLine("Insert items that you want to buy, when you are finnish, write 'done'");
        Console.Write("Insert a item: ");
            string item = Console.ReadLine();
            switch (item.ToLower())
            {
                case "done":
                    break;

                default:
                    Console.WriteLine("Write a price:");
                    decimal price = Convert.ToDecimal(Console.ReadLine());
                    var foo(i) = new Items(item, price);
                    Console.Write(" {0} {1} ", foo.Item, foo.Price);
                    break;
            }
            i++;
        } while (item != "done");

        //Then show the list in order

答案 1 :(得分:1)

非常感谢您提出的所有命题和答案,我非常感谢。但是由于我需要的是像这样的单一条件,因此,如果解决方案多于一行,那么它将无法与该软件一起使用。

但是,我找到了解决方法,使其可以在一行中满足我的要求,但是我不得不在“当前列表”中添加另一列:

- 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和SINGLE CONDITION ,如下所示:

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 LIKE 'AC[ˆHL]%') --Excluse ACHIGH01 & ACLOWER01

相同

肯定的是,结果是这样的:

A1112K
A1114AFR
A111GCAS
A111HIV
A71111
AF1111
AQ1111
AT1111
AY1111

但是,出于SQL搜索和学习的目的,如果其他人在没有其他专栏的情况下找到了更好的答案,则我始终将这个问题悬而未决。

答案 2 :(得分:0)

您可以反转逻辑以获取允许的 。我相信这是正确的逻辑:

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]%'