Sql 以逗号分隔的字符串中缺少值搜索
如果在sql中可能,请帮助我。 大家好,请大家分享一下他们的专业知识,我不太确定在SQL中是否可行 表格大小:5GB 我试图看到给定Sql 以逗号分隔的字符串中缺少值搜索,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果在sql中可能,请帮助我。 大家好,请大家分享一下他们的专业知识,我不太确定在SQL中是否可行 表格大小:5GB 我试图看到给定产品线的子表中存在无效的验证\u ID 因此,在下面的场景中,114不存在于主表中的产品线被动中,而是存在于子表中 DECLARE @CHILD TABLE ( PRODUCT_LINE VARCHAR (50), COMPONENT VARCHAR (50), MODEL VARCHAR (50), YEARS VARCHAR (50), VA
产品线的子表中存在无效的验证\u ID
因此,在下面的场景中,114不存在于主表中的产品线
被动中,而是存在于子表中
DECLARE @CHILD TABLE
(
PRODUCT_LINE VARCHAR (50),
COMPONENT VARCHAR (50),
MODEL VARCHAR (50),
YEARS VARCHAR (50),
VALIDATION_ID VARCHAR (50)
)
INSERT @CHILD
SELECT 'PASSIVE','RESISTOR','CARBON','2005','V114' UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005','V098, E009, V034' UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005','V201' UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005','V201,V098,V114' UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005',null UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005','null,V098,E009' UNION ALL
SELECT 'PASSIVE','RESISTOR','CARBON','2005','null,V114' UNION ALL
SELECT * FROM @CHILD
DECLARE @PARENT TABLE
(
PRODUCT_LINE VARCHAR (50),
VALIDATION_ID VARCHAR (50)
)
INSERT @PARENT
SELECT 'PASSIVE','V098' UNION ALL
SELECT 'PASSIVE','E009' UNION ALL
SELECT 'PASSIVE','V201' UNION ALL
SELECT 'PASSIVE','V034'
预期产出
PRODUCT_LINE COMPONENT MODEL YEARS VALIDATION_ID INVALID_VALIDATION_ID
PASSIVE RESISTOR CARBON 2005 V114 V114
PASSIVE RESISTOR CARBON 2005 V201,V098,V114 V114
'PASSIVE','RESISTOR','CARBON','2005','null,V114',V114
谢谢……您肯定需要CSV拆分器。有很多,只要搜索一下就可以了。我用的是杰夫的
如果有多个无效ID,它将显示为多行。如果希望多个无效ID显示为CSV,则需要额外的查询来连接它。如果你需要,请告诉我
编辑:更新查询以在CSV中显示无效ID
; WITH
CTE AS
(
SELECT c.*, INVALID_VALIDATION_ID = v.Item,
RN = DENSE_RANK() OVER (ORDER BY PRODUCT_LINE, COMPONENT, MODEL, YEARS, VALIDATION_ID)
FROM @CHILD c
CROSS APPLY dbo.DelimitedSplit8K(c.VALIDATION_ID, ',') v
WHERE c.VALIDATION_ID IS NOT NULL -- edit [2]
AND NOT EXISTS
(
SELECT *
FROM @PARENT p
WHERE p.PRODUCT_LINE = c.PRODUCT_LINE
and p.VALIDATION_ID = LTRIM(v.Item)
)
)
SELECT DISTINCT
PRODUCT_LINE, COMPONENT, MODEL, YEARS, VALIDATION_ID,
INVALID_VALIDATION_ID = STUFF(csv, 1, 1, '')
FROM CTE c
CROSS APPLY
(
SELECT ',' + x.INVALID_VALIDATION_ID
FROM CTE x
WHERE x.RN = c.RN
ORDER BY INVALID_VALIDATION_ID
FOR XML PATH('')
) i (csv)
你需要试试这个
SELECT *
FROM
(
SELECT c.*, INVALID_VALIDATION_ID = x.Value
FROM @CHILD c
CROSS APPLY dbo.Split(c.VALIDATION_ID, ',') x
WHERE NOT EXISTS
(
SELECT *
FROM @PARENT p
WHERE p.PRODUCT_LINE = c.PRODUCT_LINE
and p.VALIDATION_ID = x.Value
)
) AS Q
WHERE INVALID_VALIDATION_ID IS NOT NULL AND INVALID_VALIDATION_ID != 'null'
这里dbo.split函数是
CREATE FUNCTION [dbo].[Split]
(@List varchar(8000),@SplitOn varchar(5))
RETURNS @RtnValue table
(Id int identity(1,1),Value nvarchar(100))
AS
BEGIN
Set @List = Replace(@List,'''','')
While (Charindex(@SplitOn,@List)>0)
Begin
Insert Into @RtnValue (value)
Select
Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
End
Insert Into @RtnValue (Value)
Select Value = ltrim(rtrim(@List))
Return
END
试试这个 如果您有一个规范化的数据模型,这将很容易。@dnoeth:无权更改数据库结构….:(您的@PARENT
表中的列序列不与INSERT
statement@Squirrel:更正……谢谢……:)哦,我的。从字面上看null
我们如何处理null,如果null不存在于父对象中,但存在于子对象中,那么它很好,并且不需要出现在输出中。好心的建议。你是什么意思?例如?例如:对于product line电阻器,子表中存在空值,而父表中不存在空值,则会出现在结果中,但我不希望将空值视为无效的验证id。它不应出现在输出中。一个字符串包含2个有效的验证id和1个空值,然后它不应该出现在输出中,因为我在子表中添加了两行NULL,这两行不应该出现在输出中。
CREATE FUNCTION [dbo].[Split]
(@List varchar(8000),@SplitOn varchar(5))
RETURNS @RtnValue table
(Id int identity(1,1),Value nvarchar(100))
AS
BEGIN
Set @List = Replace(@List,'''','')
While (Charindex(@SplitOn,@List)>0)
Begin
Insert Into @RtnValue (value)
Select
Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
End
Insert Into @RtnValue (Value)
Select Value = ltrim(rtrim(@List))
Return
END