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

时间:2013-05-31 03:03:19

标签: sql-server-2008 tsql varcharmax

我想写一个t-sql查询,它在sql server表的列中查找值。

实施例,

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

任何帮助都将受到高度赞赏。

谢谢,

1 个答案:

答案 0 :(得分:3)

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

但是,如果这不是一个选项,则需要使用字符串操作。这是使用几个公用表表达式以及SUBSTRINGCHARINDEX的一个选项:

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