запрос на формирование подстроки - PullRequest
8 голосов
/ 10 июля 2010

Я хочу взять 01 часть строки abcd_01, используя SQL. Каким должен быть запрос для этого, где длина до _ меняется? То есть это может быть abcde_01 или ab_01. В принципе, я хочу часть после _.

Ответы [ 4 ]

15 голосов
/ 11 июля 2010

Это один из тех примеров того, как существует похожая функциональность между SQL и различными расширениями, но они настолько различны, что вы не можете гарантировать переносимость между всеми базами данных.

Ключевое слово SUBSTRING, использующее синтаксис PostgreSQL (без упоминания о сопоставлении с образцом) - ANSI-99 . Почему это заняло у них так много времени, я не знаю ...

Суть в том, что вам нужно получить подстроку существующего значения столбца, поэтому вам нужно знать, как называются функции подстроки базы данных.

Oracle


SELECT SUBSTR('abcd_01', -2) FROM DUAL

В Oracle нет функции RIGHT, в любом случае, это действительно просто оболочка для функции подстроки. Но Oracle SUBSTR позволяет вам указать отрицательное число для обработки строки в обратном порядке (конец к началу).

SQL Server


Два варианта - SUBSTRING и RIGHT :

SELECT SUBSTRING('abcd_01', LEN('abcd_01') - 1, 2)
SELECT RIGHT('abcd_01', 2)

Для краткости ПРАВО идеально. Но для мобильности SUBSTRING - лучший выбор ...

MySQL


Как и SQL Server, три опции - SUBSTR , SUBSTRING и RIGHT :

SELECT SUBSTR('abcd_01', LENGTH('abcd_01') - 1, 2)
SELECT SUBSTRING('abcd_01', LENGTH('abcd_01') - 1, 2)
SELECT RIGHT('abcd_01', 2)

PostgreSQL


PostgreSQL имеет только SUBSTRING :

 SELECT SUBSTRING('abcd_01' FROM LENGTH('abcd_01')-1 for 2)

... но он поддерживает ограниченное сопоставление с образцом, которое, как вы можете видеть, не поддерживается в других местах.

SQLite * * тысяча пятьдесят-один SQLite поддерживает только SUBSTR : SELECT SUBSTR('abcd_01', LENGTH('abcd_01') - 1, 2) Заключение


Используйте ПРАВО, если оно доступно, тогда как SUBSTR / SUBSTRING было бы лучше, если бы была необходимость перенести запрос в другие базы данных, чтобы для других было ясно, что происходит, и было бы проще найти эквивалентные функции.

5 голосов
/ 10 июля 2010

Если это всегда последние 2 символа, тогда используйте RIGHT(MyString, 2) в большинстве диалектов SQL

1 голос
/ 10 июля 2010

чтобы получить 01 из abcd_01, вы должны написать таким образом (при условии, что имя столбца - col1)

ВЫБРАТЬ подстроку (col1, -2) ИЗ ТАБЛИЦЫ

это будетдать вам два последних символа.

0 голосов
/ 17 июня 2014
select substring(names,charindex('_',names)+1,len(names)-charindex('_',names)) from test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...