我使用的是MySQL,而不是SQL,我有此表,我想选择不带“ M”的表,这是我创建的表
CREATE TABLE test (
id VARCHAR(10)
);
INSERT INTO test (id) VALUES ('M1');
INSERT INTO test (id) VALUES ('M2');
....
INSERT INTO test (id) VALUES ('M128');
INSERT INTO test (id) VALUES ('M129');
我希望代码选择像这样:
Select Substring(id,1) from test
结果来自“ M1”->“ M129” 但是当这样的代码时:
Select Substring(id,2) from test
结果是从1-> 129
所以起点是1,而不是0
但是当我在W3school或某些网络上阅读时,它说起点是0。
Somone可以告诉我为什么吗?
答案 0 :(得分:2)
不确定您看到的内容,但是W3Schools docs for MySql显示以下内容:
注意
字符串中的第一个位置是1
MySql Official看起来像这样:
要从中提取子字符串的字符串中第一个字符的位置估计为1。
还有其他一些东西
开始
是一个整数或bigint表达式,用于指定返回的字符的起始位置。 (编号是从1开始的,表示表达式中的第一个字符是1)。
start_pos 必需。开始提取的位置。字符串中的第一个位置是1
位置为0(零)时,将其视为1。
其中的 NONE 与ansi standard匹配,这很奇怪,它需要额外的FROM
和FOR
关键字,而不是简单的“正常”函数语义。 / p>
<character substring function> ::=
SUBSTRING <left paren> <character value expression> FROM <start position>
[ FOR <string length> ] <right paren>
Postgresql是我所知道的唯一支持该语法的数据库。
答案 1 :(得分:0)
答案 2 :(得分:0)
mysql的子字符串语法是
SUBSTR(string,position)
SUBSTR(string,position,length)
对于mysql来说,子字符串从位置1开始工作是正确的(w3school是正确的)。现在这是您的观点。 您如何看待子字符串中的“位置”值。
POSITION中的数字类似于
根据您的第一个查询
Select Substring(id,1) from test
这表示从位置1开始
(注:请记住,此位置值不表示从位置1擦除或(删除),而是表示从起始位置1选择)。
所以结果是M1,M2,M128,M129
根据您的第二个查询
Select Substring(id,2) from test
此位置2的意思是“从1.开始,将位置1的id值擦除到位置2(请记住,直到2不带2)”
结果是1,2,128,129(只是删除了位置1的值)
最后的例子是
SELECT SUBSTRING('Engineer',5);
因此它将从位置1开始删除字符“ E”,直到位置5表示“ N”(位置5的未擦除值)
结果是“需要”