sql server 2012:函数获取给定字符串的位置,然后获取给定位置的字符串

聚集的

我有一个表,其中有2列:optionValuesoptionNamesoptionNames包含组合框的文本和optionValues每个文本的值,两者均用分隔~例如 :

optionValues | optionNames
   0~1       |   male~female

我正在尝试创建一个函数,该函数将optionValue作为参数并返回optionName。使用上面的示例:

fn.GetOptionName(1) --will return `female`

如何分隔值并取回正确的值?

这是我开始的工作,但由于不分隔值而无法使用:

select @on = OptionNames from dbo.Table 
where tablename = @tablename and fieldname = @fieldname and optionvalues = @fieldvalue

(无论数据库模式是好是坏,我都无法更改它)

编辑

找到此函数,该函数在特定位置返回子字符串:DelimitedSplit8K

帕万·库玛(Pawan Kumar)

请尝试这个(SQL 2016 +)

资料产生

CREATE TABLE Splits
(
     optionValues varchar(20)
    ,optionNames varchar(200)
)
GO

INSERT INTO Splits VALUES
('0~1','male~female'),
('0~1~2','male~female~Trans'),
('0~1','male~F')
GO

DECLARE @Find AS VARCHAR(10) = '1'
;WITH CTE0 AS
(
    SELECT * , ROW_NUMBER() OVER (ORDER BY ( SELECT NULL ) ) rnk  FROM Splits
)
,CTE AS 
(
    SELECT * , ROW_NUMBER() OVER (PARTITION BY rnk ORDER BY rnk) rnk1  FROM CTE0
    CROSS APPLY 
    (
        SELECT Value 
        FROM STRING_SPLIT(optionValues, '~'))
    p
)
,CTE1 AS
(
    SELECT * , ROW_NUMBER() OVER (PARTITION BY rnk ORDER BY rnk) rnk1 FROM CTE0
    CROSS APPLY 
    (
        SELECT Value 
        FROM STRING_SPLIT(optionNames, '~'))
    p1
)
SELECT s.*,ISNULL(p.value,'') Value FROM Splits s
LEFT JOIN 
(
    SELECT a.optionValues, a.optionNames , b.value FROM CTE a 
    INNER JOIN CTE1 b ON a.optionNames = b.optionNames
    AND a.optionValues = b.optionValues AND a.rnk = b.rnk AND a.rnk1 = b.rnk1
    WHERE a.value = @Find
)p ON p.optionValues = s.optionValues AND p.optionNames = s.optionNames

输出值

optionValues         optionNames              Value
-------------------- ------------------------ ---------
0~1                  male~female              female
0~1~2                male~female~Trans        female
0~1                  male~F                   F

(3 rows affected)

为SQL 2012+解决方案添加

DECLARE @Find AS VARCHAR(10) = '1'
;WITH CTE0 AS
(
    SELECT * , ROW_NUMBER() OVER (ORDER BY ( SELECT NULL ) ) rnk  FROM Splits
)
,CTE AS 
(    
    SELECT * , ROW_NUMBER() OVER (PARTITION BY rnk ORDER BY rnk) rnk1 FROM 
    (
        SELECT *,CAST('<A>'+ REPLACE(optionValues,'~','</A><A>')+ '</A>' AS XML) po
        FROM CTE0
    )rt
    CROSS APPLY ( SELECT t.value('.', 'VARCHAR(10)') Value FROM po.nodes('/A') AS x(t) ) o
)
,CTE1 AS
(
    SELECT * , ROW_NUMBER() OVER (PARTITION BY rnk ORDER BY rnk) rnk1 FROM 
    (
        SELECT *,CAST('<A>'+ REPLACE(optionNames,'~','</A><A>')+ '</A>' AS XML) po
        FROM CTE0
    )rt
    CROSS APPLY ( SELECT t.value('.', 'VARCHAR(10)') Value FROM po.nodes('/A') AS x(t) ) o
)
SELECT s.*,ISNULL(p.value,'') Value FROM Splits s
LEFT JOIN 
(
    SELECT a.optionValues, a.optionNames , b.value , a.rnk FROM CTE a 
    INNER JOIN CTE1 b ON a.optionNames = b.optionNames
    AND a.optionValues = b.optionValues AND a.rnk = b.rnk AND a.rnk1 = b.rnk1
    WHERE a.value = @Find
)p ON p.optionValues = s.optionValues AND p.optionNames = s.optionNames
ORDER BY rnk

输出值

optionValues         optionNames             Value
-------------------- ----------------------- ----------
0~1                  male~female             female
0~1~2                male~female~Trans       female
0~1                  male~F                  F

(3 rows affected)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

获取字符串分隔符内的子字符串 SQL Server 2012

SQL Server:获取给定月份的行顺序号

SQL Server-从字符串位置到字符串结尾的子字符串

SQL Server 2008-添加到名称列中特定位置的字符串

SQL 提取给定字符串的两个逗号之间的字符串,并拆分为两列的键值对

SQL Server:按位置插入字符串

SQL Server:如何从SQL字符串获取值

使用 SQL Server 从子字符串位于不同位置的字符串中提取子字符串

获取给定字符串中的子字符串位置

SQL Server:从字符串标题中获取列数据

从SQL Server表的varchar列获取子字符串

获取从SQL Server返回的字符串值

从SQL Server中的字符串获取分号前的单词

SQL Server - 获取字符串的不同部分

从字符串中删除特定字符(SQL Server 2012)

在SQL Server中获取给定月份和年份的所有日期

如何在SQL Server查询中获取给定ID的所有子级

在SQL Server中如何获取给定日期的所有月份和年份

如何检查给定的字符串是SQL Server中的保留关键字

SQL Server 2012的此连接字符串正确吗?

MS Access对Azure SQL Server 2012的连接字符串

如何在SQL Server 2012中拆分字符串?

如何为 SQL Server 2012 创建连接字符串?

从SQL Server中的另一个字符串获取仅字符字符串

SQL Server 2012:在单个列中返回多个字符串以获取公共行ID

从字符串中删除空格,然后在SQL Server中选择使用该字符串

如何在SQL Server中某些字符之间获取子字符串

如何使用SQL Server从字符串中获取中间字符?

SQL Server:选择字符串不包含某些值的位置