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