在某个单词之后和一个字符之前选择一个字符串的36个字符

时间:2017-09-29 08:08:00

标签: sql sql-server

我已经看过很多关于使用子字符串和字符索引函数在SQL中选择某些数据的文章,但似乎没有任何东西适合我想要做的事情,或者我无法根据自己的需要调整它们。

我正在尝试在某个单词之后选择36个字符 - 起始单词为systemuser|,并且在;之前将在字符串的末尾。如果字符串中有多个systemuser|实例,则应选择第一个实例。

示例数据:

CREATE TABLE #Temp (col nvarchar(max))

INSERT INTO #Temp (col)
values ('account|f50aa0e3-2f87-e311-8502-005056b412da;systemuser|765e4a01-1802-e611-80dc-5065f38aca11;systemuser|9fa34207-1802-e611-80dc-5065f38aca11;account|0aa90a25-1786-e311-8502-005056b412da;contact|381e4b65-4387-e311-8502-005056b412da;contact|32eecd7a-dc8c-e311-8502-005056b412da;contact|2e536442-ebf7-e511-a997-005056b412da;contact|f45fac8d-4187-e311-8502-005056b412da')
,('contact|32eecd7a-dc8c-e311-8502-005056b412da')
,('systemuser|ab1852fb-1702-e611-80dc-5065f38aca11')
,('account|5d807c84-da86-e311-8502-005056b412da;systemuser|34ae3f0d-1802-e611-80dc-5065f38aca11')
,('account|08a90a25-1786-e311-8502-005056b412da;contact|369ede29-4287-e311-8502-005056b412da;systemuser|01ae3f0d-1802-e611-80dc-5065f38aca11')

SELECT * FROM #Temp

到目前为止,我已尝试了substringcharindex的许多不同组合,但我担心自己无法理解需要如何修改选择我想要的东西。

SELECT 
      col
      ,CASE WHEN col LIKE '%systemuser|%' THEN SUBSTRING(col, CHARINDEX('systemuser|', col), LEN(col)) ELSE NULL END AS TESTTHIS
      , SUBSTRING(col, CHARINDEX('|', col), LEN(col))
      ,RIGHT(col, charindex('|', col) - 1)
      --,SUBSTRING(col, CHARINDEX('systemuser|', col), CHARINDEX(';',col) - CHARINDEX('systemuser|', col) + Len(';'))
     -- ,CASE WHEN LEFT(col, 3) = 'sys' THEN right(col, charindex('systemuser|', reverse(col)) - 1) ELSE NULL END AS ToUser
     --,SUBSTRING(col, CHARINDEX('systemuser|', col) + 10, CHARINDEX(';', col) - (CHARINDEX('systemuser|', col) + 12))
     --,SUBSTRING(col, LEN(LEFT(col, CHARINDEX ('systemuser|', col))) + 1, LEN(col) - LEN(LEFT(col, CHARINDEX ('systemuser|', col))) - LEN(RIGHT(col, LEN(col) - CHARINDEX (';', col))) - 1)
  FROM #temp

注释掉的代码是那些不起作用的代码 - 我想我会粘贴它们来展示我曾尝试过的东西。

按上述行顺序排列的所需结果:

 '765e4a01-1802-e611-80dc-5065f38aca11'
 ,NULL
 ,'ab1852fb-1702-e611-80dc-5065f38aca11'
 ,'34ae3f0d-1802-e611-80dc-5065f38aca11'
 ,'01ae3f0d-1802-e611-80dc-5065f38aca11'

任何人都可以帮助我解决我的问题,我将非常感激。

感谢您提前提供任何帮助。

2 个答案:

答案 0 :(得分:2)

使用PATINDEX

onOpenDialog : function () {
  var oView = this.getView();
  if (!this._oDialog) {
      this._oDialog = sap.ui.xmlfragment(oView.getId(), "sap.ui.demo.wt.view.HelloDialog");
      oView.addDependent(this._oDialog);
  }
  this._oDialog.open();
},     
dialogAfterclose: function(oEvent) {//function called after Dialog is closed
   this._oDialog.destroy();//destroy only the content inside the Dialog
},
confirmOk: function(oEvent) {
    this._oDialog.close();//Just close the Dialog, Dialog afterClose() will be called and destroy the Dialog content.
}

答案 1 :(得分:0)

如下所示,请确保systemuser|后跟GUID:

DECLARE @pattern varchar(273) = '%systemuser|[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]%';

SELECT
    CASE WHEN PATINDEX(@pattern, col)=0 THEN NULL ELSE
    SUBSTRING(col, PATINDEX(@pattern, col)+11,36) END AS systemuserGUID
FROM #temp