Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中,有没有一种方法可以拆分列以提取'-'后面的文本?_Sql Server_String_Text Extraction - Fatal编程技术网

Sql server 在SQL Server中,有没有一种方法可以拆分列以提取'-'后面的文本?

Sql server 在SQL Server中,有没有一种方法可以拆分列以提取'-'后面的文本?,sql-server,string,text-extraction,Sql Server,String,Text Extraction,我知道以前有人用其他方式问过这个问题,但我不想把一个字符串推过一个变量 我有一列包含如下数据:QWERTYUIOP-1、QWERTYUIOP-XL、ASDFG-2、HGJFK-SM。 该列称为product。我需要能够提取'-'后面的文本,以便将其作为大小存储在另一列中。对于这个实例,让我们调用表产品 如何在SQL Server中实现这一点?postgreSQL中的split_部分非常简单,但除了string_split之外,似乎没有其他类似的函数,这只适用于表。当我试图对一列使用它时,它说st

我知道以前有人用其他方式问过这个问题,但我不想把一个字符串推过一个变量

我有一列包含如下数据:QWERTYUIOP-1、QWERTYUIOP-XL、ASDFG-2、HGJFK-SM。 该列称为product。我需要能够提取'-'后面的文本,以便将其作为大小存储在另一列中。对于这个实例,让我们调用表产品

如何在SQL Server中实现这一点?postgreSQL中的split_部分非常简单,但除了string_split之外,似乎没有其他类似的函数,这只适用于表。当我试图对一列使用它时,它说string_split不存在

有人能帮我一下吗?

一种方法是使用STUFF删除前导字符,然后使用CHARINDEX查找这些前导字符的结尾:

SELECT V.YourString,
       STUFF(V.YourString,1,CHARINDEX('-',V.YourString),'') AS TrailingCharacters
FROM (VALUES('QWERTYUIOP-1'),('QWERTYUIOP-XL'),('ASDFG-2'),('HGJFK-SM'))V(YourString)
好了,现在球门柱已经移动了。您可以修改上述内容,以使用“反向”获取最后一个字符的位置:

或者,您可以使用类似的字符串拆分器并获取最后一行:

WITH CTE AS(
    SELECT V.YourString,
           DS.ItemNumber,
           DS.Item,
           ROW_NUMBER() OVER (PARTITION BY V.YourString ORDER BY DS.ItemNumber DESC) AS RN
    FROM (VALUES('QWERTYUIOP-1'),('QWERTYUIOP-XL'),('ASDFG-2'),('HGJFK-SM'),('QWER-WETT-EWT-1'))V(YourString)
         CROSS APPLY dbo.DelimitedSplit8K(V.YourString,'-') DS)
SELECT YourString,
       DS.Item
FROM CTE
WHERE RN = 1;
一种方法是使用STUFF删除前导字符,并使用CHARINDEX查找这些前导字符的结尾:

SELECT V.YourString,
       STUFF(V.YourString,1,CHARINDEX('-',V.YourString),'') AS TrailingCharacters
FROM (VALUES('QWERTYUIOP-1'),('QWERTYUIOP-XL'),('ASDFG-2'),('HGJFK-SM'))V(YourString)
好了,现在球门柱已经移动了。您可以修改上述内容,以使用“反向”获取最后一个字符的位置:

或者,您可以使用类似的字符串拆分器并获取最后一行:

WITH CTE AS(
    SELECT V.YourString,
           DS.ItemNumber,
           DS.Item,
           ROW_NUMBER() OVER (PARTITION BY V.YourString ORDER BY DS.ItemNumber DESC) AS RN
    FROM (VALUES('QWERTYUIOP-1'),('QWERTYUIOP-XL'),('ASDFG-2'),('HGJFK-SM'),('QWER-WETT-EWT-1'))V(YourString)
         CROSS APPLY dbo.DelimitedSplit8K(V.YourString,'-') DS)
SELECT YourString,
       DS.Item
FROM CTE
WHERE RN = 1;

您可以使用String_split和JSON_VALUE的组合将值拆分为多列

声明@productSize tableProductName VARCHAR500 插入到@productSize值中 “QWERTYUIOP-1、QWERTYUIOP-XL、ASDFG-2、HGJFK-SM” 选择 JSON_VALUEconcat“[”,replacevalue“-”,“,”,“]',“$[0]”作为产品名称, JSON_VALUEconcat“[”,replacevalue“-”,“,”,“]',“$[1]”作为productSize 来自@productSize 交叉应用字符串\u SPLITProductName,,'
您可以使用String_split和JSON_VALUE的组合将值拆分为多列

声明@productSize tableProductName VARCHAR500 插入到@productSize值中 “QWERTYUIOP-1、QWERTYUIOP-XL、ASDFG-2、HGJFK-SM” 选择 JSON_VALUEconcat“[”,replacevalue“-”,“,”,“]',“$[0]”作为产品名称, JSON_VALUEconcat“[”,replacevalue“-”,“,”,“]',“$[1]”作为productSize 来自@productSize 交叉应用字符串\u SPLITProductName,,' 不要出于您的目的使用STRING_SPLIT,因为字符串被拆分为行和行

输出行可以是任意顺序。顺序不能保证与输入字符串中子字符串的顺序匹配

所以你永远不会知道哪个是leftcode,哪个是rightsize

不要出于您的目的使用STRING_SPLIT,因为字符串被拆分为行和行

输出行可以是任意顺序。顺序不能保证与输入字符串中子字符串的顺序匹配


因此,您永远不会知道哪个是leftcode,哪个是rightsize。

您好,谢谢您的帮助,如果产品像QWER-WETT-EWT-1一样,而我仍然只想检索结束文本呢?这就是为什么提供具有代表性的样本数据很重要,@JK1993。你的问题中应该有这样一个例子,这样用户就不会浪费时间给出与真正问题不符的答案。如果你觉得浪费了时间,请道歉,并感谢你的帮助!您好,谢谢。如果产品是这样的QWER-WETT-EWT-1,而我仍然只想检索结束文本,该怎么办?这就是为什么提供具有代表性的样本数据很重要,@JK1993。你的问题中应该有这样一个例子,这样用户就不会浪费时间给出与真正问题不符的答案。如果你觉得浪费了时间,请道歉,并感谢你的帮助!
select 
 left(product,charindex('-',product)-1) product_code
 ,right(product,len(product)-charindex('-',product)) product_size
from (values('QWERTYUIOP-1'),('QWERTYUIOP-XL'),('ASDFG-2'),('HGJFK-SM')) p (product)