Получить конкретную строку из выражения в столбце в T-SQL - PullRequest
0 голосов
/ 03 июля 2018

В моей таблице базы данных SQL Server есть столбец, который содержит '|' (труба) разделенные значения.

Пример:

'FirstName |testname| lastName | lastname | roll |ee097765 | 100 | end'
'FirstName |testname1| lastName | lastname1 | roll2 |ee0977652 | 1100 | end'.

Я хочу извлечь метки только с помощью T-SQL, где мой выходной столбец будет иметь только метки, то есть только 100 или 1100 впоследствии. В Oracle мы можем использовать

    SUBSTRING_INDEX 

функция, но она не доступна в T-SQL.

Может кто-нибудь указать мне, как это сделать?

    SUBSTRING_INDEX(SUBSTRING_INDEX(field, '|', 3), '|', -1)

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

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

public partial class UserDefinedFunctions
{
    [SqlFunction]
    public static SqlString GetMarkPosition(SqlString sqlString)
    {
        // Assume there will be no result,
        // so initialize return value to null string.
        SqlString retVal = SqlString.Null;

        // Extract C# string
        string input = sqlString.Value;

        // I use Regex Split method rather array Split method,
        // since Regexe method handles spaces in elegant way.
        string pattern = @"\s*\|\s*";

        // Get array of values
        string[] split = Regex.Split(input, pattern);

        // The logic is the following:
        // First, we find the marker's position in list.
        // The sought value is one index less.
        // This process is repeated for each marker.
        // If no match is found for any marker,
        // the function will just return empty string,
        // as we initialized retVal variable.
        foreach (string marker in new[] { "100", "1100" })
        {
            var list = new List<string>(split);
            int index = list.IndexOf(marker);
            if (index > 0)
            {
                retVal = new SqlString(list[index - 1]);
                break;
            }
        }
        return retVal;
    }
}

Чтобы создать эту функцию, вам нужно выполнить несколько шагов. Если вы используете SQL Server 2017, модель безопасности была изменена (см., Например, здесь и здесь ), поэтому Visual Studio не поможет вам в создании сборки на SQL Сторона сервера - вам придется делать это вручную.

0 голосов
/ 03 июля 2018
declare @TEST table(val  nvarchar(1000))

insert into @TEST
values ('FirstName |testname| lastName | lastname | roll |ee097765 | 100 | end'),
        ('FirstName |testname1| lastName | lastname1 | roll2 |ee0977652 | 1100 | end')

 SELECT Value 
  FROM @TEST CROSS APPLY 
       Split(val,'|')
  WHERE ISNUMERIC(Value) = 1

Вам просто нужно использовать общую функцию разделения, которую вы найдете: https://codereview.stackexchange.com/questions/15125/sql-server-split-function

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...