2016-07-27 2 views
1

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

См. Пример ниже.

Это запрос:

replace(replace(aa.SourceQuery,'sequence','"sequence"'),'timestamp','"timestamp"') 

До:

select timestamp, SparkTimeStamp 
from SparkRecordCounts 

После:

select "timestamp", Spark"timestamp" 
from SparkRecordCounts 

Однако, я хочу, чтобы это было как:

select "timestamp", Sparktimestamp 
from SparkRecordCounts 
+4

Что вы RDBMS? Поддерживает ли он регулярные выражения в замене функциональности? –

+0

Oracle имеет regexp_replace, который будет делать это, но нам действительно нужно знать ваши РСУБД. –

+1

Можете ли вы подтвердить, какую базу данных вы используете, и хотите ли вы указать зарезервированные ключевые слова, которые используются в качестве идентификаторов в ваших строках SQL-запросов? Я предполагаю это, потому что очевидно, что «timestamp» - это тип данных, а 'sequence' - генератор числовой последовательности. –

ответ

0

EDIT Я написал это, прежде чем зная, какие RDBMS вы использовали, но оставили его на случай, если он поможет кому-то другому.

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

Oracle имеет один встроенный, называется REGEXP_REPLACE, и вы могли бы использовать что-то вроде этого:

regexp_replace(aa.SourceQuery, '(^|\s|\W)timestamp($|\s|\W)', '\1"timestamp"\2') 

Регулярное выражение выглядит на старте для:

  • ^- начало строки ИЛИ
  • \ s - пробел ИЛИ
  • \ W - не-буквенный символ

Затем он соответствует timestamp, и должно заканчиваться:

  • $ - конец строки ИЛИ
  • \ S - символ пробела ИЛИ
  • \ W - не-слово характер

Затем, и только тогда он выполняет замену. \ 1 и \ 2 используются для сохранения границы слова, согласованного в начале и в конце слова.

Я не уверен, как другие базы данных обрабатывают regexp_replace, похоже, что mysql может через плагин, например, this, но не может быть родной метод.

SQL Server имеет решение что-то подобное here

Смежные вопросы