Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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中的数据隔离_Sql Server - Fatal编程技术网

Sql server SQL中的数据隔离

Sql server SQL中的数据隔离,sql-server,Sql Server,我的数据库表中有一个复杂的Id,如is 00-000-000。 所有名称存储在一个字段中 01-000-000=Warehouse 01-001-000-=Rack 01-001-001=Bin cart 放在同一张桌子上。我想在3个不同的字段中分离数据。在SQL中可能吗?由于我们没有足够的信息,我假设您希望将每行开头的3个数字标识符拆分为3个单独的数字 如果ID始终是固定长度的(即2个字母,然后是一个破折号,然后是3个字母,然后是一个破折号,然后是3个字母),则可以使用子字符串函数将其拆分

我的数据库表中有一个复杂的Id,如is 00-000-000。 所有名称存储在一个字段中

01-000-000=Warehouse
01-001-000-=Rack
01-001-001=Bin cart 

放在同一张桌子上。我想在3个不同的字段中分离数据。在SQL中可能吗?

由于我们没有足够的信息,我假设您希望将每行开头的3个数字标识符拆分为3个单独的数字

如果ID始终是固定长度的(即2个字母,然后是一个破折号,然后是3个字母,然后是一个破折号,然后是3个字母),则可以使用子字符串函数将其拆分

WITH TestData as (
    SELECT '01-000-000=Warehouse' AS Id
    UNION 
    SELECT '01-001-000-=Rack' AS Id
    UNION 
    SELECT '01-001-001=Bin cart' AS Id
)
SELECT 
    Id,
    substring(Id, 0, 2) AS FirstId,
    substring(Id, 4, 3) AS SecondId,
    substring(Id, 8, 3) AS ThirdId,
    substring(Id, 11, len(id) - 10) AS RestOfString
FROM TestData

如果虚线长度可变,则必须使用类似CHARINDEX函数的函数来查找虚线的位置,然后在其上拆分。

如果虚线长度始终相同,则可以使用左右键执行一些简单的代码

试验数据

IF OBJECT_ID('tempdb..#TestData') IS NOT NULL DROP TABLE #TestData
GO
CREATE TABLE #TestData (FieldName varchar(50))
INSERT INTO #TestData (FieldName)
VALUES
('01-000-000=Warehouse')
,('01-001-000-=Rack')
,('01-001-001=Bin cart')
查询

SELECT
FieldName
,LEFT(FieldName,2) Result1
,RIGHT(LEFT(FieldName,6),3) Result2
,RIGHT(LEFT(FieldName,10),3) Result3
FROM #TestData
结果

FieldName               Result1 Result2 Result3
01-000-000=Warehouse    01      000     000
01-001-000-=Rack        01      001     000
01-001-001=Bin cart     01      001     001

将其用于带2“-”号的动态值


谢谢

还有另一个带有parsename函数的方法

select PARSENAME(replace(left(FieldName,10),'-','.'),3) col1,
PARSENAME(replace(left(FieldName,10),'-','.'),2) col2,
PARSENAME(replace(left(FieldName,10),'-','.'),1) col3 from yourTable

这叫做正常化,而不是隔离。这是可能的,但您必须编写代码才能做到这一点。你有具体的问题吗?是的,当然有。但是你必须更好地定义你需要什么,并且,至少展示一些尝试。作为提示,您可以将更新函数与子字符串函数一起使用。我需要仓库、货架、仓车分开,而不是id我的id第一个总店仓库、第二个总店货架和第三个仓车我需要这个形状的结果col-1 warehoue col-2 rack col-3 Bin Cart更新你的问题并准确显示你想要的结果。列的数量以及每个列应包含哪些数据
select PARSENAME(replace(left(FieldName,10),'-','.'),3) col1,
PARSENAME(replace(left(FieldName,10),'-','.'),2) col2,
PARSENAME(replace(left(FieldName,10),'-','.'),1) col3 from yourTable