読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

substrの開始番号

ハマったのでメモ。
Perlのsubstrは substr(文字,開始位置,長さ) の開始位置は0オリジンで、
SQLのsubstrも同じく SUBSTR(文字,開始位置,長さ) と同じ使い方ができるが、1オリジンである。

print substr('string!!!', 2, 1); #=> 'r'
-- MySQL
SELECT SUBSTR('string!!!', 2, 1); --#=> 't'


ただしSQLのSUBSTRでも開始位置に0が使用できる。
その場合の挙動は、

  • MySQL … 空文字
  • Oracle開始位置に1を指定したときと同じ(ここでハマった)

になる。

-- MySQL
SELECT SUBSTR('string!!!', 1, 1); --#=> 's'
SELECT SUBSTR('string!!!', 0, 1); --#=> ''
-- Oracle
SELECT SUBSTR('string!!!', 1, 1) FROM dual; --#=> 's'
SELECT SUBSTR('string!!!', 0, 1) FROM dual; --#=> 's'


SQL方言怖い><


参考:
SUBSTR、SUBSTRB - オラクル・Oracle SQL 関数リファレンス