Найдите индекс последнего вхождения подстроки с помощью T-SQL

В языке, реализующем классическое наследование, таком как Java, C # или C ++, вы начинаете с создания класса - проекта ваших объектов - и затем вы можете создавать новые объекты из этого класса или расширять класс, определяя новый класс, который дополняет исходный класс.

В JavaScript вы сначала создаете объект (нет понятия класса), затем вы можете дополнить свой собственный объект или создать из него новые объекты. Это не сложно, но немного чуждо и трудно усваивается для кого-то, привыкшего к классическому способу.

Пример:

//Define a functional object to hold persons in JavaScript
var Person = function(name) {
  this.name = name;
};

//Add dynamically to the already defined object a new getter
Person.prototype.getName = function() {
  return this.name;
};

//Create a new object of type Person
var john = new Person("John");

//Try the getter
alert(john.getName());

//If now I modify person, also John gets the updates
Person.prototype.sayMyName = function() {
  alert('Hello, my name is ' + this.getName());
};

//Call the new method on john
john.sayMyName();

До сих пор я расширял базовый объект, теперь я создаю другой объект, а затем наследование от личности.

//Create a new object of type Customer by defining its constructor. It's not 
//related to Person for now.
var Customer = function(name) {
    this.name = name;
};

//Now I link the objects and to do so, we link the prototype of Customer to 
//a new instance of Person. The prototype is the base that will be used to 
//construct all new instances and also, will modify dynamically all already 
//constructed objects because in JavaScript objects retain a pointer to the 
//prototype
Customer.prototype = new Person();     

//Now I can call the methods of Person on the Customer, let's try, first 
//I need to create a Customer.
var myCustomer = new Customer('Dream Inc.');
myCustomer.sayMyName();

//If I add new methods to Person, they will be added to Customer, but if I
//add new methods to Customer they won't be added to Person. Example:
Customer.prototype.setAmountDue = function(amountDue) {
    this.amountDue = amountDue;
};
Customer.prototype.getAmountDue = function() {
    return this.amountDue;
};

//Let's try:       
myCustomer.setAmountDue(2000);
alert(myCustomer.getAmountDue());

var Person = function (name) {
    this.name = name;
};
Person.prototype.getName = function () {
    return this.name;
};
var john = new Person("John");
alert(john.getName());
Person.prototype.sayMyName = function () {
    alert('Hello, my name is ' + this.getName());
};
john.sayMyName();
var Customer = function (name) {
    this.name = name;
};
Customer.prototype = new Person();

var myCustomer = new Customer('Dream Inc.');
myCustomer.sayMyName();
Customer.prototype.setAmountDue = function (amountDue) {
    this.amountDue = amountDue;
};
Customer.prototype.getAmountDue = function () {
    return this.amountDue;
};
myCustomer.setAmountDue(2000);
alert(myCustomer.getAmountDue());

Хотя, как уже говорилось, я не могу вызвать setAmountDue (), getAmountDue () для Person.

//The following statement generates an error.
john.setAmountDue(1000);
116
задан Kevin Panko 31 July 2013 в 20:45
поделиться

4 ответа

Вы ограничены небольшим списком функций для текстового типа данных.

Все, что я могу предложить, это начать с PATINDEX , но работать в обратном направлении от DATALENGTH-1, DATALENGTH-2, DATALENGTH-3 и т. д. до тех пор, пока вы не получите результат или не достигнете нуля (DATALENGTH-DATALENGTH)

Это действительно то, что SQL Server 2000 просто не может справиться.

Изменить для других ответов : REVERSE не входит в список функций, которые могут использоваться с текстовыми данными в SQL Server 2000

29
ответ дан 24 November 2019 в 02:11
поделиться

Я знаю, что это будет неэффективно, но рассматривали ли вы возможность преобразования поля text в varchar , чтобы вы могли использовать решение, предоставленное на веб-сайте ты нашел? Я знаю, что это решение вызовет проблемы, поскольку вы потенциально можете обрезать запись, если длина в поле text превышает длину вашего varchar (не говоря уже о том, что это будет не очень производительно ).

Поскольку ваши данные находятся внутри текстового поля (и вы используете SQL Server 2000), ваши возможности ограничены.

1
ответ дан 24 November 2019 в 02:11
поделиться

Прямолинейный путь? Нет, но я использовал обратное. Буквально.

В предыдущих подпрограммах, чтобы найти последнее вхождение заданной строки, я использовал функцию REVERSE (), затем CHARINDEX, а затем REVERSE, чтобы восстановить исходный порядок. Например:

SELECT
   mf.name
  ,mf.physical_name
  ,reverse(left(reverse(physical_name), charindex('\', reverse(physical_name)) -1))
 from sys.master_files mf

показывает, как извлечь фактические имена файлов базы данных из их «физических имен», независимо от того, насколько глубоко они вложены во вложенные папки. При этом выполняется поиск только одного символа (обратная косая черта), но вы можете использовать это для более длинных строк поиска.

Единственным недостатком является то, что я не знаю, насколько хорошо это будет работать с типами данных TEXT. Я использую SQL 2005 уже несколько лет и больше не знаком с работой с ТЕКСТОМ - но я, кажется, припоминаю, что вы могли использовать на нем ВЛЕВО и ВПРАВО?

Philip

167
ответ дан 24 November 2019 в 02:11
поделиться

Поменяйте местами строку и подстроку, затем найдите первое вхождение.

2
ответ дан 24 November 2019 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: