首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL字符串函数

SQL字符串函数
EN

Stack Overflow用户
提问于 2014-02-15 22:21:04
回答 2查看 420关注 0票数 2

这是我花了太多时间讨论的问题。

我把一个字符串作为

代码语言:javascript
复制
@OrderString varchar(255) = '1=1;|2=|3=|4=1;|5=|'

第一个数字是我想订购的项目,我将把它保存在@ItemNum中,=之后的第二个数字是数量(将作为@ItemQuat存储)。数量可以是从1到1000之间的任何东西。如果零是有序的,那么它将只是项目编号和=

问题是我如何动态地提取这些值?我只想要大于0的值。

我已经花了好几个小时来处理它,我不确定是否需要更新构建字符串的逻辑,或者是否可以使用sql中的string函数来提取正确的值。

我现在拥有的例子:

代码语言:javascript
复制
--Obviously this won't work because it will always pull 1 regardless if the amount ordered is 0  
set @ItemNum = substring(@OrderString, 1, charindex('=', @OrderString, 1)-1)

--This is currently wrong too because its pulling the quant for item 1
set @ItemQuat = substring(@OrderString, charindex('=',@OrderString,1)+1, charindex('|',@OrderString,1)-charindex('=',@OrderString,1)-1)

在提取第一个值之后,我正在循环并连接字符串,等等。

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-16 00:04:51

这个查询将将该字符串转换为包含ItemNumber和ItemValue列的表结果,并且只返回值大于零的行。这个对你有用吗?

代码语言:javascript
复制
DECLARE @OrderString VARCHAR(MAX) = '1=1;|2=|3=|4=1;|5=|';

WITH Step0 AS
(
    SELECT
        String = REPLACE(@OrderString, ';', '')
),
Step1 AS
(
    SELECT
        Block = SUBSTRING(String, 1, CHARINDEX('|', String) - 1),
        String = SUBSTRING(String, CHARINDEX('|', String) + 1, LEN(String))
    FROM
        Step0

    UNION ALL

    SELECT
        Block = SUBSTRING(String, 1, CHARINDEX('|', String) - 1),
        String = SUBSTRING(String, CHARINDEX('|', String) + 1, LEN(String))
    FROM
        Step1
    WHERE
        LEN(String) > 0
),

Step2 AS
(
    SELECT
        ItemNumber = SUBSTRING(Block, 1, CHARINDEX('=', Block) - 1),
        ItemValue = SUBSTRING(Block, CHARINDEX('=', Block) + 1, LEN(Block))
    FROM
        Step1
),

Step3 AS
(
    SELECT
        ItemNumber = CAST(ItemNumber AS INT),
        ItemValue = CAST(ItemValue AS INT)
    FROM
        Step2
    WHERE
        CAST(ItemValue AS INT) > 0
)

SELECT
    *
FROM
    Step3;

PS.:我觉得这个练习很奇怪,所以我想我会用它发个帖子,希望你不要介意:

https://tangodude.wordpress.com/2014/02/16/t-sql-extracting-serialized-data-from-string-in-one-go/

票数 2
EN

Stack Overflow用户

发布于 2014-02-16 01:49:35

如果它是“从XML传入的”,您可能会更好地传递XML而不是字符串。将XML处理到您想要的内容非常简单。

您甚至可以做一些丑陋的事情来将字符串返回到XML中:

代码语言:javascript
复制
DECLARE @OrderString VARCHAR(MAX) = '1=1;|2=|3=|4=1;|5=|';

DECLARE @xml XML
SELECT @xml = CAST('<order_line><item_id>'
             +REPLACE(REPLACE(REPLACE(STUFF(@OrderString,LEN(@OrderString),1,''),';',''),'|' ,'</quantity></order_line><order_line><item_id>'),'=','</item_id><quantity>')
             +'</quantity></order_line>' AS XML)

然后很简单:

代码语言:javascript
复制
SELECT c.value('(item_id)[1]', 'int') item_id
      ,c.value('(quantity)[1]', 'int') quantity
  FROM @xml.nodes('/order_line') T(c)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21804435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档