我已经看过很多关于使用子字符串和字符索引函数在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
到目前为止,我已尝试了substring
和charindex
的许多不同组合,但我担心自己无法理解需要如何修改选择我想要的东西。
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'
任何人都可以帮助我解决我的问题,我将非常感激。
感谢您提前提供任何帮助。
答案 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