【问题标题】:SQL String functionsSQL 字符串函数
【发布时间】:2014-03-15 07:03:46
【问题描述】:

这个问题我已经投入了太多时间。

我正在传递一个字符串

@OrderString varchar(255) = '1=1;|2=|3=|4=1;|5=|'

第一个数字是我要订购的商品,我将其保存在@ItemNum 中,= 之后的第二个数字是数量(将存储为 @ItemQuat)。数量可以是 1 到 1000 之间的任何值。如果订购的数量为零,则它只是项目编号和=

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

我已经搞砸了好几个小时,我不确定我是否必须更新构建字符串的逻辑,或者是否可以使用 sql 中的字符串函数提取正确的值。

我目前拥有的示例:

--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)

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

任何帮助将不胜感激!

【问题讨论】:

  • 这个字符串是从哪里来的?如果该数据在某个表中,那么您最好重新查询该表并获取原始的“未字符串化”数据,而不是稍后尝试拆分此字符串版本。
  • 它是从xml传入的。在下订单之前,我正在检查订购的数量是否可用。所以我无法从表中拉出字符串:(
  • 您使用的是 SQL Server 还是 MySQL?
  • SQL Server .....我需要更新那个标签

标签: sql sql-server string sql-server-2008 substring


【解决方案1】:

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

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】:

    如果它是“从 XML 传入的”,那么传入 XML 而不是字符串可能会好得多。将 XML 处理成您想要的内容将非常简单。

    您甚至可以做一些丑陋的事情来将字符串恢复为 XML:

    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)
    

    然后真的很简单:

    SELECT c.value('(item_id)[1]', 'int') item_id
          ,c.value('(quantity)[1]', 'int') quantity
      FROM @xml.nodes('/order_line') T(c)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 2016-11-21
      • 2020-09-26
      • 2015-04-02
      • 2021-10-28
      • 2021-10-21
      相关资源
      最近更新 更多