子字符串索引从右侧跳过分隔符

krcsximq  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(354)

我有一张“购车”表,上面有一个“描述”栏。该列是一个字符串,包括名首字母,后跟句号、空格和姓氏。描述列的一个示例是
“j。吹
我正在使用“substring\u index”函数提取列字符串中“.”前面的字母。像这样:

SELECT
Description,
SUBSTRING_INDEX(Description, '.', 1) as TrimInitial,
SUBSTRING_INDEX(
SUBSTRING_INDEX(Description, '.', 1),' ', -1) as trimmed,
length(SUBSTRING_INDEX(
SUBSTRING_INDEX(Description, '.', 1),' ', -1)) as length
from car_purchases;

我将此查询称为1。
结果集(结果1)的图片如下
如您所见,问题在于select语句中的“trimmed”列开始计算第二个分隔符“”,而不是右侧的第一个分隔符,并生成结果“by j”,而不仅仅是“j”。此外,length列指示字符串长度是5而不是4所以wtf?
但是当我执行下面的select语句时;

select SUBSTRING_INDEX(
SUBSTRING_INDEX('Car purchased by J. Blow', '.', 1),' ', -1); -- query 2

result='j'作为'result 2'。
从结果1可以看出,“description”列中的字符串与“result 2”中的字符串完全相同(据我所知)。但是在列上执行子字符串索引(而不仅仅是字符串本身)时,结果会忽略第一个分隔符,并从字符串右侧的第二个分隔符中选择一个字符串。
我为此绞尽脑汁,尝试用“by”和“by”作为分隔符,但这两个选项都不能产生一个字符所需的结果。我不想通过使用trim函数来增加查询1的复杂性。我也尝试过结果列“trimmed”的cast函数,但仍然没有成功。我也不想谈这个。
查询1的“length”列中有一个异常,如果我将length函数更改为char\u length函数,如下所示:

select length(SUBSTRING_INDEX(
SUBSTRING_INDEX(Description, '.', 1),' ', -1)) as length -- result = 5

select char_length(SUBSTRING_INDEX(
SUBSTRING_INDEX(Description, '.', 1),' ', -1)) as length -- result = 4

有人能解释一下为什么上面的select语句会产生两种不同的结果吗?我想这就是为什么我没有得到我想要的结果的原因。
但要清楚的是,我想要的结果是得到“j”而不是“by j”。
我想我可以试试倒过来,但我不认为这是一个可以接受的妥协。另外,我不熟悉排序规则和字符集原则,只是使用默认值。
为球员们干杯!!!!

tzxcd3kk

tzxcd3kk1#

CHAR_LENGTH 返回字符长度,因此包含4个2字节字符的字符串将返回4。 LENGTH 但是,返回字节长度,因此包含4个2字节字符的字符串将返回8。你的结果不一致(包括 SUBSTRING_INDEX )说的是 by 以及 J 实际上不是一个单字节空格(ascii0x20),而是一个看起来像空格的2字节字符。要解决此问题,可以尝试使用空格替换所有unicode字符 CONVERT 以及 REPLACE . 在这个例子中,我有一个 en-space 字符串中的unicode字符 by 以及 J . 这个 CONVERT 将其更改为 ? ,和 REPLACE 然后将其转换为空格:

SELECT SUBSTRING_INDEX( SUBSTRING_INDEX("Car purchased by J. Blow", '.', 1),' ', -1)

输出:

by J

CONVERT 以及 REPLACE :

SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(REPLACE(CONVERT("Car purchased by J. Blow" USING ASCII), '?', ' '), '.', 1),' ', -1)

输出

J

对于您的查询,您可以将字符串替换为您的列名,即。

SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(REPLACE(CONVERT(description USING ASCII), '?', ' '), '.', 1),' ', -1)

在dbfiddle上演示

相关问题