【问题标题】:SELECT Query with LIKE '%b-%' returns 0 row on MS SQL Server 2012SELECT Query with LIKE '%b-%' 在 MS SQL Server 2012 上返回 0 行
【发布时间】:2017-09-25 16:47:45
【问题描述】:

在我的 sql 查询中,我使用 '%b-%' 执行代码,查询返回 0 行。

这是我的查询:

SELECT NAME, SURNAME, AGE FROM PERSONS WHERE NAME LIKE '%b-%'

没有喜欢:

SELECT NAME, SURNAME, AGE FROM PERSONS WHERE NAME = 'b-rush'

所有查询都返回 0 行。

我有 'b-rush''b-rush1''b-rush2' 等值。

【问题讨论】:

  • 显示一些示例数据
  • 您查询的数据库的排序规则是什么?是否偶然区分大小写(不寻常但发生)。
  • 愚蠢的问题,但是由于您使用的是 MS SQL Server,您确定选择了正确的数据库吗?
  • 完全取消 where 子句;你得到结果了吗?
  • 你执行SELECT NAME, SURNAME, AGE FROM PERSONS有没有结果?

标签: sql sql-server tsql sql-server-2012 sql-like


【解决方案1】:

正如@abatishchev 所说,如果排序规则是,表可以有排序规则的差异

  • CI = 不区分大小写,您的查询可以正常工作
  • CS = 区分大小写,您需要在查询中使用正确的大小写

    DECLARE @PERSONS table (NAME_CASE_Insensitive   varchar(30) COLLATE 
    Latin1_General_CI_AS_KS_WS NOT NULL 
                            ,NAME_CASE_sensitive  varchar(30) COLLATE 
    Latin1_General_CS_AS_KS_WS NOT NULL 
                            )
    insert @PERSONS (NAME_CASE_Insensitive , NAME_CASE_sensitive) values 
    ('B-rush','B-rush'),('b-rush1','B-rush1'),('b-rush2','B-rush2')
    

不区分大小写 - 返回全部

SELECT * FROM @PERSONS WHERE NAME_CASE_Insensitive = 'b-rush'


NAME_CASE_Insensitive          NAME_CASE_sensitive
------------------------------ ------------------------------
B-rush                         B-rush

区分大小写 - 不返回任何内容

SELECT * FROM @PERSONS WHERE NAME_CASE_sensitive = 'b-rush'
NAME_CASE_Insensitive          NAME_CASE_sensitive
------------------------------ ------------------------------

不区分大小写 - 返回全部

SELECT* FROM @PERSONS WHERE NAME_CASE_Insensitive LIKE '%b-%'

    NAME_CASE_Insensitive          NAME_CASE_sensitive
    ------------------------------ ------------------------------
    B-rush                         B-rush
    b-rush1                        B-rush1
    b-rush2                        B-rush2

区分大小写 - 不返回任何内容

SELECT* FROM @PERSONS WHERE NAME_CASE_sensitive LIKE '%b-%'
NAME_CASE_Insensitive          NAME_CASE_sensitive
------------------------------ ------------------------------

区分大小写 - 全部返回

SELECT* FROM @PERSONS WHERE NAME_CASE_sensitive LIKE '%B-%'
NAME_CASE_Insensitive          NAME_CASE_sensitive
------------------------------ ------------------------------
B-rush                         B-rush
b-rush1                        B-rush1
b-rush2                        B-rush2

正确区分大小写

SELECT* FROM @PERSONS WHERE NAME_CASE_sensitive LIKE '%[bB]-%'
NAME_CASE_Insensitive          NAME_CASE_sensitive
------------------------------ ------------------------------
B-rush                         B-rush
b-rush1                        B-rush1
b-rush2                        B-rush2

【讨论】:

  • 正如我所说,我的表不区分大小写。
【解决方案2】:

更改当前选择的数据库。

Correct Database Wrong database

如果表的创建混乱,就会发生这种情况。

假设您在 SQL Management Studio 上运行一个新查询:

CREATE TABLE test (temp nvarchar(7))

您在我的屏幕截图中看到的下拉列表中选择了 Master。您已经创建了一个测试表,但在 Master 上。通常,您不希望这样,因此您可以在特定数据库上创建它,而不是通过在查询中指定它或修改选定的下拉选项。

CREATE TABLE MyDatabase.dbo.test (temp nvarchar(7))

您现在在 Master 和 MyDatabase 上都有表。如果您运行未指定数据库名称的选择查询,它将使用该下拉列表中选择的任何内容。哪个可能是 Master,很可能不是您的数据。

【讨论】:

  • 拜托,它与OP问题无关,如果有,OP会出错。 OP 说他得到 0 个结果。
  • 这取决于他如何插入。如果由于某种原因,MASTER 有表(如果 CREATE TABLE 查询针对 Master 运行,这并非不可能),那么查询 显然没有任何原因返回任何结果。诚然,我应该更清楚。
  • 即使他在另一个数据库中创建表,也会返回错误消息“找不到表名,不是 0 行
  • 如果表在两个数据库上都存在,则不会。关于这是排序规则问题还是我所说的问题的答案实际上归结为“SELECT NAME, SURNAME, AGE FROM PERSONS 是否返回任何内容?”
  • 如我所说。我不是新手。)
猜你喜欢
  • 2017-10-30
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多