Sql server 2008 在Sql server的Varchar(max)列中搜索文本

Sql server 2008 在Sql server的Varchar(max)列中搜索文本,sql-server-2008,tsql,varcharmax,Sql Server 2008,Tsql,Varcharmax,我想编写一个t-sql查询,在SQLServer表的一列中查找值 例如 CREATE TABLE Transactions (Details varchar(max)); “详细信息”列中存储了以下类型的字符串 ID=124|NAME=JohnDoe|DATE=020620121025|ISPRIMARY=True| TRANSACTION_AMOUNT=124.36|DISCOUNT_AMOUNT=10.00|STATE=GA| ADDR1=test|ADDR2=test22|OTHER=O

我想编写一个t-sql查询,在SQLServer表的一列中查找值

例如

CREATE TABLE Transactions (Details varchar(max));
“详细信息”列中存储了以下类型的字符串

ID=124|NAME=JohnDoe|DATE=020620121025|ISPRIMARY=True|
TRANSACTION_AMOUNT=124.36|DISCOUNT_AMOUNT=10.00|STATE=GA|
ADDR1=test|ADDR2=test22|OTHER=OtherDetailsHere

ID=6257|NAME=michael|DATE=050320111255|ISPRIMARY=False|
TRANSACTION_AMOUNT=4235.00|DISCOUNT_AMOUNT=33.25|STATE=VA|
ADDR1=test11|ADDR2=test5|OTHER=SomeOtherDetailsHere
目标是编写查询,该查询给出以下输出

 Name     |   Transaction Amount | Discount
 -------------------------------------------
 JohnDoe  |   124.36             | 10.00
 michael  |   4235.00            | 33.25
任何帮助都将不胜感激

谢谢


Joe

为什么要将数据管道分隔存储在一列中?这些字段应该作为列添加到表中

但是,如果这不是一个选项,您将需要使用字符串操作。这里有一个选项,它使用了两个常用的表表达式,以及
子字符串
CHARINDEX

WITH CTE1 AS (
  SELECT 
      SUBSTRING(Details, 
            CHARINDEX('|NAME=', DETAILS) + LEN('|NAME='), 
            LEN(Details)) NAME,
      SUBSTRING(Details, 
            CHARINDEX('|TRANSACTION_AMOUNT=', DETAILS) + LEN('|TRANSACTION_AMOUNT='), 
            LEN(Details)) TRANSACTION_AMOUNT,
      SUBSTRING(Details, 
            CHARINDEX('|DISCOUNT_AMOUNT=', DETAILS) + LEN('|DISCOUNT_AMOUNT='), 
            LEN(Details)) DISCOUNT_AMOUNT
  FROM Transactions
), CTE2 AS (
  SELECT 
      SUBSTRING(NAME,1,CHARINDEX('|',NAME)-1) NAME,
      SUBSTRING(TRANSACTION_AMOUNT,1,CHARINDEX('|',TRANSACTION_AMOUNT)-1) TRANSACTION_AMOUNT,
      SUBSTRING(DISCOUNT_AMOUNT,1,CHARINDEX('|',DISCOUNT_AMOUNT)-1) DISCOUNT_AMOUNT
  FROM CTE1
)
SELECT * 
FROM CTE2

为什么要将数据管道分隔存储在一列中?这些字段应作为列添加到表中

但是,如果这不是一个选项,您将需要使用字符串操作。这里有一个选项,它使用了两个常用的表表达式,以及
子字符串
CHARINDEX

WITH CTE1 AS (
  SELECT 
      SUBSTRING(Details, 
            CHARINDEX('|NAME=', DETAILS) + LEN('|NAME='), 
            LEN(Details)) NAME,
      SUBSTRING(Details, 
            CHARINDEX('|TRANSACTION_AMOUNT=', DETAILS) + LEN('|TRANSACTION_AMOUNT='), 
            LEN(Details)) TRANSACTION_AMOUNT,
      SUBSTRING(Details, 
            CHARINDEX('|DISCOUNT_AMOUNT=', DETAILS) + LEN('|DISCOUNT_AMOUNT='), 
            LEN(Details)) DISCOUNT_AMOUNT
  FROM Transactions
), CTE2 AS (
  SELECT 
      SUBSTRING(NAME,1,CHARINDEX('|',NAME)-1) NAME,
      SUBSTRING(TRANSACTION_AMOUNT,1,CHARINDEX('|',TRANSACTION_AMOUNT)-1) TRANSACTION_AMOUNT,
      SUBSTRING(DISCOUNT_AMOUNT,1,CHARINDEX('|',DISCOUNT_AMOUNT)-1) DISCOUNT_AMOUNT
  FROM CTE1
)
SELECT * 
FROM CTE2

Hi@sgeddes,您的答案解决了测试场景中提到的问题,但是当使用真实数据实施相同的解决方案时,它不起作用,无法确定原因,请您在ThanksNope使用真实数据查看feedle,这是我的错误…您的解决方案起作用了…您成就了我的一天!非常感谢:-)您好@sgedes,您的答案解决了测试场景中提到的问题,但是当使用真实数据实现相同的解决方案时,它不起作用,无法确定原因,请您在ThanksNope这里查看feedle with real data,这是我的错误…您的解决方案起作用了…您让我度过了美好的一天!非常感谢:-)