SQL 字符串函数

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

这是一个我投入了太多时间的问题。

我传入一个字符串

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

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

如有任何帮助,我们将不胜感激!

最佳答案

此单个查询会将该字符串转换为包含 [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/

关于SQL 字符串函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21804435/

相关文章:

sql - oracle 中的 count(*) 过滤

sql - Windows 无法在本地计算机上启动 SQL Server (SQLEXPRESS) 服务。错误 1053

mysql - 带有示例数据库的 SQL 练习/查询

Python 字符串 : obtaining what's left after python string slice

c# - 获取两个字符串的公共(public)前缀

mysql - 从 max(column) 重置自动增量

mysql - 从表中选择每个用户的前 3 个查看图像

mysql - 使用 LISTAGG 选择连接表上的多行

sql-server - 阻止 SQL Server Management Studio 添加 ANSI_NULLS 和 QUOTED_IDENTIFIER

python - 是否可以在字符串上重载 ~ 运算符?