Sql 如何在乘法使用的特定字符之间获取值

Sql 如何在乘法使用的特定字符之间获取值,sql,Sql,那是我的桌子 123 | 123-456-345 234 | 332-433 221 | 221 这就是我想要得到的结果 123 | 123 123 | 456 123 | 345 234 | 332 234 | 433 221 | 221 使用SQL Server,您可以执行以下操作: DECLARE @tbl TABLE(ID INT,YourString VARCHAR(MAX)); INSERT INTO @tbl VALUES(123,'123-456-345'),(234,'33

那是我的桌子

123 | 123-456-345
234 | 332-433
221 | 221
这就是我想要得到的结果

123 | 123
123 | 456
123 | 345
234 | 332
234 | 433
221 | 221

使用SQL Server,您可以执行以下操作:

DECLARE @tbl TABLE(ID INT,YourString VARCHAR(MAX));
INSERT INTO @tbl VALUES(123,'123-456-345'),(234,'332-433'),(221,'221');

SELECT tbl.ID
      ,x.value('.','int') AS Value
FROM @tbl AS tbl
CROSS APPLY(SELECT CAST('<x>' + REPLACE(YourString,'-','</x><x>') + '</x>' AS XML)) AS Casted(AsXml)
CROSS APPLY Casted.AsXml.nodes('/x') AS A(x)
DECLARE@tbl表(ID INT,YourString VARCHAR(MAX));
插入@tbl值(123,'123-456-345'),(234,'332-433'),(221,'221');
选择tbl.ID
,x.value('.',int')作为值
从@tbl作为tbl
交叉应用(选择CAST(''+REPLACE(您的字符串'-','')+''作为XML))作为Casted(AsXml)
将Casted.AsXml.nodes('/x')交叉应用为(x)
诀窍是,将字符串
123-456-345
转换为有效的XML,只需简单地替换
-
123456345


可以使用
.nodes()
查询此XML,要逐个获取所有条目

如果您使用的是SQL Server 2016,请使用STRING\u SPLIT函数

SELECT ID,  value  
FROM Yourtable  
    CROSS APPLY STRING_SPLIT([YourColumn], '-');  
对于较低版本的SQL server,您可以按照@shungo的建议进行操作,也可以创建一个用户定义的函数来拆分字符串并在select语句中调用它

CREATE FUNCTION [dbo].[SplitWords]
(    
      @Input NVARCHAR(MAX),
      @Character CHAR(1)
)
RETURNS @Output TABLE (
      Item NVARCHAR(1000)
)
AS
BEGIN
      DECLARE @StartIndex INT, @EndIndex INT

      SET @StartIndex = 1
      IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
      BEGIN
            SET @Input = @Input + @Character
      END

      WHILE CHARINDEX(@Character, @Input) > 0
      BEGIN
            SET @EndIndex = CHARINDEX(@Character, @Input)

            INSERT INTO @Output(Item)
            SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)

            SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))
      END

      RETURN
END

如果您使用的是Postgres,则可以使用
string\u to\u array()
unnest()



但是您应该真正地修复您的数据模型。将分隔字符串存储在单个列中是一个非常糟糕的主意。

对于Oracle 11g,这里有一个简单的解决方案(只需将
选项卡
替换为表名,将
num
str
替换为列名):

它给了我以下结果:

1   123 123
2   123 345
3   123 456
4   221 221
5   234 332
6   234 433

您能告诉我们到目前为止您已经尝试了什么吗?您的RDBMS是什么?以前有人问过这个问题:对于,,…不要在一列中存储多个值。修复您的数据模型
select t.id, x.val
from the_table t
    cross join lateral unnest(string_to_array(the_column), '-') as x(val);  
WITH
tab1 AS (
SELECT num, SUBSTR(str,1,3) str FROM tab
UNION ALL 
SELECT num, SUBSTR(str,5,3) str FROM tab
UNION ALL 
SELECT num, SUBSTR(str,9,3) str FROM tab
)
SELECT * 
FROM tab1
WHERE str IS NOT NULL
1   123 123
2   123 345
3   123 456
4   221 221
5   234 332
6   234 433