SQL Server-选择包含查询字符串的列,并将值拆分为其他“列”
我需要在包含以下查询字符串的列中进行选择:SQL Server-选择包含查询字符串的列,并将值拆分为其他“列”,sql,sql-server,Sql,Sql Server,我需要在包含以下查询字符串的列中进行选择: user_id=300&company_id=201503&status=WAITING OPERATION&count=1 我想在一个新列中执行选择并断开每个值,例如: user_id | company_id | status | count 300 | 201503 | WAITING OPERATION | 1 如果不使用procs,如何在SQL Server中执行此操作
user_id=300&company_id=201503&status=WAITING OPERATION&count=1
我想在一个新列中执行选择并断开每个值,例如:
user_id | company_id | status | count
300 | 201503 | WAITING OPERATION | 1
如果不使用procs,如何在SQL Server中执行此操作
我尝试了一个函数:
CREATE FUNCTION [xpto].[SplitGriswold]
(
@List NVARCHAR(MAX),
@Delim1 NCHAR(1),
@Delim2 NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
SELECT
Val1 = PARSENAME(Value,2),
Val2 = PARSENAME(Value,1)
FROM
(
SELECT REPLACE(Value, @Delim2, '&') FROM
(
SELECT LTRIM(RTRIM(SUBSTRING(@List, [Number],
CHARINDEX(@Delim1, @List + @Delim1, [Number]) - [Number])))
FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
FROM sys.all_objects) AS x
WHERE Number <= LEN(@List)
AND SUBSTRING(@Delim1 + @List, [Number], LEN(@Delim1)) = @Delim1
) AS y(Value)
) AS z(Value)
);
GO
但它只返回一列,其中包含所有内容:
QueryString
user_id=300&company_id=201503&status=WAITING OPERATION&count=1
提前感谢。您需要在select语句中使用SQL子字符串。首先需要构建第一行,然后使用联合返回第二行 我以前做过很多次,你真幸运!由于每个字符串只有3个分隔符,而且这个数字是固定的,所以可以使用SQL Server的PARSENAME函数来完成此操作。这远没有使用XML解析的最佳选择那么难看。尝试此未测试的查询,用适当的名称替换表名和列名:
SELECT
PARSENAME(REPLACE(COLUMN_NAME,'&','.'),1) AS 'User',
PARSENAME(REPLACE(COLUMN_NAME,'&','.'),2) AS 'Company_ID',
PARSENAME(REPLACE(COLUMN_NAME,'&','.'),3) AS 'Status',
PARSENAME(REPLACE(COLUMN_NAME,'&','.'),4) AS 'Count',
FROM TABLE_NAME
这将以user_id=300的形式得到结果,这是您想要的最困难的部分。我让你做简单的部分,在=号前把东西放下
注意:我不记得PARSENAME是否会因为非法的名称字符=符号而发疯。如果有,只需在其中嵌套另一个替换,将其转换为其他内容,如下划线。您的意思是没有内置函数吗?我想您可以使用locate查找user_id=的出现点,然后查找下一个出现的&,对子字符串进行一些有趣的处理,这将非常低效,但我想如果你的字符串中没有任何有趣的content@scragar我会找的。这可能很有用:@Tanner真的很有用,但我需要在同一行中为用户的每一行输入“user\u id”、“company\u id”、“status”和“count”。Logan示例会很有用,因为这对操作没有真正的帮助谢谢你,伙计。很棒的解决方案:乐意帮助!我本应该事先指出我们合同的细则,但你欠我你21岁的孩子。我会等的。
SELECT
PARSENAME(REPLACE(COLUMN_NAME,'&','.'),1) AS 'User',
PARSENAME(REPLACE(COLUMN_NAME,'&','.'),2) AS 'Company_ID',
PARSENAME(REPLACE(COLUMN_NAME,'&','.'),3) AS 'Status',
PARSENAME(REPLACE(COLUMN_NAME,'&','.'),4) AS 'Count',
FROM TABLE_NAME