无法匹配 SQL table 中的单个字符
Having trouble matching a single character in an SQL table
我需要使用'_'通配符来查找所有只有一个字母的id,其中有几个。但是,当我 运行 我的查询时,没有行被 returned.
这是我的查询:
SELECT *
FROM table
WHERE id LIKE '_';
我有一个 table 可以调用 Table1,它有两列,id 和 name。
id 有 1 个或 2 个字符来标记名称。我试图只找到 ID 只有一个字符的名称。这是 table 的示例:
id name
A Alfred
AD Andy
B Bob
BC Bridget
本例中我只想return Alfred 和 Bob。
我不想要解决方案,但任何建议或想法都会有所帮助。
这是我的查询截图:
http://i.imgur.com/EWTfoVI.png?1
这是我的 table 的一个小例子:
http://i.imgur.com/urGRZeK.png?1
因此,在我的 table 这个例子中,理想情况下我希望只有东亚... returned。
如果我专门搜索它有效的字符,但出于某种奇怪的原因,“_”通配符不起作用。
例如:
SELECT *
FROM icao
WHERE prefix_code ='Z';
这有效。
尝试使用 TRIM
Select *
FROM [Table]
where TRIM(ID) LIKE '_';
SELECT *
FROM table
WHERE LENGTH(id)=1
在MySQL中,下划线用于表示单个字符的通配符。您可以在此处阅读有关 Pattern Matching 的更多信息。
按照您的编写方式,您的查询将提取 id 列只有一个字符的任何行,您无需更改任何内容。
这是一个 SQL Fiddle 示例。
编辑
一个故障排除技巧是确保没有白色space before/after 前缀代码。如果有,你需要删除它,添加 TRIM():
SELECT *
FROM myTable
WHERE TRIM(id) LIKE '_';
这里有一个 TRIM 的例子。
编辑 2
希望能对您的怪异行为进行一些解释。在 MySQL 中,如果一个字符上有尾随白色 space,如果你说 id = 'Z';
它仍然会匹配 this fiddle 现在看到的。但是,前导白色 space 不会与此匹配,但仍会被 TRIM() 更正,因为这会删除 varchar 前后端的白色 space。
TL;DR 您在 Z 之后有尾随白色 space,这是导致问题的原因。
奇怪...,在我的情况下完美运行(我使用的是 mysql 5.5)。
请试试这个:
select * from mysql.help_topic where name like '_';
你得到了什么套装?
对您观察到的行为最可能的解释是值中的尾随空格(或其他空格)。也就是你看到一个字符
'A'
但该值实际上可能存储为两个(或更多)字符。
'A '
要查看实际存储的内容,您可以使用 HEX
和 LENGTH
函数。
SELECT t.foo
, LENGTH(t.foo)
, HEX(t.foo)
FROM mytable t
WHERE t.foo LIKE 'A%'
%
是 LIKE
运算符的通配符,可匹配任意数量的字符(零个、一个或多个)。
您可以使用 RTRIM()
函数删除尾随空格...
SELECT RTRIM(t.foo)
, LENGTH(RTRIM(t.foo))
, HEX(RTRIM(t.foo))
FROM mytable t
WHERE t.foo LIKE 'A%'
我需要使用'_'通配符来查找所有只有一个字母的id,其中有几个。但是,当我 运行 我的查询时,没有行被 returned.
这是我的查询:
SELECT *
FROM table
WHERE id LIKE '_';
我有一个 table 可以调用 Table1,它有两列,id 和 name。 id 有 1 个或 2 个字符来标记名称。我试图只找到 ID 只有一个字符的名称。这是 table 的示例:
id name
A Alfred
AD Andy
B Bob
BC Bridget
本例中我只想return Alfred 和 Bob。
我不想要解决方案,但任何建议或想法都会有所帮助。
这是我的查询截图: http://i.imgur.com/EWTfoVI.png?1
这是我的 table 的一个小例子: http://i.imgur.com/urGRZeK.png?1
因此,在我的 table 这个例子中,理想情况下我希望只有东亚... returned。
如果我专门搜索它有效的字符,但出于某种奇怪的原因,“_”通配符不起作用。
例如:
SELECT *
FROM icao
WHERE prefix_code ='Z';
这有效。
尝试使用 TRIM
Select *
FROM [Table]
where TRIM(ID) LIKE '_';
SELECT *
FROM table
WHERE LENGTH(id)=1
在MySQL中,下划线用于表示单个字符的通配符。您可以在此处阅读有关 Pattern Matching 的更多信息。
按照您的编写方式,您的查询将提取 id 列只有一个字符的任何行,您无需更改任何内容。
这是一个 SQL Fiddle 示例。
编辑
一个故障排除技巧是确保没有白色space before/after 前缀代码。如果有,你需要删除它,添加 TRIM():
SELECT *
FROM myTable
WHERE TRIM(id) LIKE '_';
这里有一个 TRIM 的例子。
编辑 2
希望能对您的怪异行为进行一些解释。在 MySQL 中,如果一个字符上有尾随白色 space,如果你说 id = 'Z';
它仍然会匹配 this fiddle 现在看到的。但是,前导白色 space 不会与此匹配,但仍会被 TRIM() 更正,因为这会删除 varchar 前后端的白色 space。
TL;DR 您在 Z 之后有尾随白色 space,这是导致问题的原因。
奇怪...,在我的情况下完美运行(我使用的是 mysql 5.5)。 请试试这个:
select * from mysql.help_topic where name like '_';
你得到了什么套装?
对您观察到的行为最可能的解释是值中的尾随空格(或其他空格)。也就是你看到一个字符
'A'
但该值实际上可能存储为两个(或更多)字符。
'A '
要查看实际存储的内容,您可以使用 HEX
和 LENGTH
函数。
SELECT t.foo
, LENGTH(t.foo)
, HEX(t.foo)
FROM mytable t
WHERE t.foo LIKE 'A%'
%
是 LIKE
运算符的通配符,可匹配任意数量的字符(零个、一个或多个)。
您可以使用 RTRIM()
函数删除尾随空格...
SELECT RTRIM(t.foo)
, LENGTH(RTRIM(t.foo))
, HEX(RTRIM(t.foo))
FROM mytable t
WHERE t.foo LIKE 'A%'