【问题标题】:SQL Like single letter with wildcardSQL Like 带通配符的单个字母
【发布时间】:2015-03-26 13:28:12
【问题描述】:

我对 SQL 数据库的 SQL 查询有问题。我不能简单地找出原因。

我想获取 ShortName 包含“A”的所有行。

ShortName 列的数据类型为 nvarchar(max)

我的桌子是这样的:

如果我对数据库执行此查询: SELECT ID, ShortName FROM Airports where ShortName LIKE '%A%';

结果:

如果我执行此查询: SELECT ID, ShortName FROM Airports where ShortName LIKE '%AA%';

结果:

如您所见,它不会占用短名称包含“A”的所有行。 但为什么?我一直在寻找答案,但我找不到。

【问题讨论】:

  • 那么为什么'%A%'返回AARAAL
  • 是的,这个问题很简单
  • 我无法重现这个。您的第一个查询应该返回更多行。但是,到底为什么要在 NVARCHAR(MAX) 字段中存储三个字母代码?
  • 您确定所有字符串中的A 都相同吗?因为有可能,例如,在一个字符串中包含西里尔字母 A,而在其他字符串中包含拉丁字母..
  • showing cast(shortname as varbinary(max)) 将证实这一点。

标签: sql-server


【解决方案1】:

由于您位于斯堪的纳维亚半岛,因此您的数据库默认排序规则很可能是 Danish_Norwegian_CI_AS。这将导致 AA 被解释为 Å

因此,要使您的查询正常工作,请使用:

SELECT ID, ShortName FROM Airports 
where ShortName LIKE '%A%' 
COLLATE Latin1_General_CI_AS;

【讨论】:

    【解决方案2】:

    归结为您在数据库中使用的排序规则,我猜是因为 AA 在某些语言(例如丹麦语)中可以以不同的方式重复
    如果您执行以下操作,您将为每个选择获得不同的结果。

    DECLARE @t TABLE (v VARCHAR(max))
    INSERT INTO @t VALUES ('AAR')
    SELECT * FROM @t WHERE v COLLATE SQL_Latin1_General_CP1255_CS_AS LIKE '%A%' COLLATE SQL_Latin1_General_CP1255_CS_AS
    
    SELECT * FROM @t WHERE v COLLATE Danish_Norwegian_CI_AI LIKE '%A%' COLLATE Danish_Norwegian_CI_AI
    

    这给了我第一次的结果 AAR,而第二次没有。

    【讨论】:

      【解决方案3】:

      您能否编写表格和数据的脚本?

      如果我这样做:

      SELECT CAST(1 as int) AS ID, CAST('AAR' AS nvarchar(MAX)) AS ShortName INTO #Airports
      
      INSERT INTO #Airports
      SELECT 2, 'CPH' UNION ALL
      SELECT 3, 'STA' UNION ALL
      SELECT 4, 'AAL' UNION ALL
      SELECT 5, 'CNL' UNION ALL
      SELECT 6, 'ZGH' UNION ALL
      SELECT 7, 'ROD' UNION ALL
      SELECT 8, 'KRP' 
      
      SELECT * FROM #Airports a
      SELECT ID, ShortName FROM #Airports where ShortName LIKE '%A%';
      SELECT ID, ShortName FROM #Airports where ShortName LIKE '%AA%';
      

      我确实得到了预期的结果:

               ID ShortName
      ----------- ----------------------------------------------------------------
                2 CPH
                3 STA
                4 AAL
                5 CNL
                6 ZGH
                7 ROD
                8 KRP
                1 AAR
      
      (8 row(s) affected)
      
               ID ShortName
      ----------- ----------------------------------------------------------------
                3 STA
                4 AAL
                1 AAR
      
      (3 row(s) affected)
      
               ID ShortName
      ----------- ----------------------------------------------------------------
                4 AAL
                1 AAR
      
      (2 row(s) affected)
      

      【讨论】:

        【解决方案4】:

        奇怪,当我执行你的第一个查询时:

        CREATE TABLE  testtt
        (
        ID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
        ShortName nvarchar(max),
        );
        
        insert into testtt (ShortName) values ('AAR');
        insert into testtt (ShortName) values ('BLL');
        insert into testtt (ShortName) values ('CPH');
        insert into testtt (ShortName) values ('EBJ');
        insert into testtt (ShortName) values ('KRP');
        insert into testtt (ShortName) values ('ODE');
        insert into testtt (ShortName) values ('RKE');
        insert into testtt (ShortName) values ('RNN');
        insert into testtt (ShortName) values ('SGD');
        insert into testtt (ShortName) values ('SKS');
        insert into testtt (ShortName) values ('TED');
        insert into testtt (ShortName) values ('STA');
        insert into testtt (ShortName) values ('AAL');
        insert into testtt (ShortName) values ('CNL');
        insert into testtt (ShortName) values ('WGH');
        
        
        SELECT ID, ShortName
        FROM testtt
        WHERE ShortName LIKE '%A%'
        
        SELECT * FROM Testtt
        

        我得到了想要的结果..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-09
          • 2018-12-25
          • 2011-06-22
          • 2011-07-08
          • 2012-12-15
          • 1970-01-01
          相关资源
          最近更新 更多