0

我想编写一个 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

任何帮助将不胜感激。

谢谢,

4

1 回答 1

3

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

但是,如果这不是一个选项,您将需要使用字符串操作。这是使用几个通用表表达式以及SUBSTRINGand的一个选项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
于 2013-05-31T03:21:02.800 回答