我要用csv格式的对应ID替换列中的csv数据
我的查询存在问题:
select t0.code , t0.categories, t0.departement, (
SELECT Stuff((
SELECT N', ' + CONVERT(varchar, id_categorie) FROM tcategories t1 WHERE t0.departement = t1.departement COLLATE French_CI_AI and categorie IN (t0.tcategories)
FOR XML PATH(''),TYPE).value('text()[1]','varchar(max)'),1,1,N'')) as id_colonne
FROM #codes_reductions t0 where categories is not null
结果如下:
代码|类别|部门| id_colonne
AIRSTREAM | ' A'' B'' BA' | JMQ | NULL
如果我更换'和类别IN(t0.tcategories)'通过和分类IN(' A',' B'' BA')查询效果很好
结果如下:
代码|类别|部门| id_colonne
AIRSTREAM | ' A'' B'' BA' | JMQ | 128,129,260
我尝试在我的专栏上使用COLLATE French_CI_AI,但没有成功。有什么想法吗?
答案 0 :(得分:0)
... categorie IN (t0.tcategories) ....
问题的原因是categorie
列将这些值('A','B','BA'
)存储为单个值而不是数组/列表/值表。因此,SQL Server比较两个字符串,因此s1 IN (s2)
相当于s1 = s2
=> A
IN('A','B','BA'
)< => A
= 'A','B','BA'
。
示例(注意:双引号(''
)用于定义空字符串,而四个单引号(''''
)用于定义带有单引号的字符串:{{1} }):
SELECT '''' --> '
短期解决方案是使用以下条件之一:
DECLARE @categories VARCHAR(1000);
SET @categories = '''A'',''B'',''BA'''
SELECT @categories AS ColA, CASE WHEN 'A' IN (@categories) THEN 'TRUE' ELSE 'FALSE' END AS Col2
/*
ColA Col2
------------ -----
'A','B','BA' FALSE
*/
示例:
C#1 (if categorie contains single quotes): ... t0.tcategories LIKE '%' + categorie + '%' ....
C#2 (when categorie doesn't contains single quotes): ... t0.tcategories LIKE '%''' + categorie + '''%' ....
第二个注释:当DECLARE @categories VARCHAR(1000);
SET @categories = '''A'',''B'',''BA'''
SELECT @categories AS ColA, CASE WHEN @categories LIKE '%''A''%' THEN 'TRUE' ELSE 'FALSE' END AS Col2
/*
ColA Col2
------------ -----
'A','B','BA' TRUE
*/
列中的每个单独的值不包含单引号时(例如:t0.tcategories
/ 'B'A'
),此方法有效
在中/长期,您应该使用另一个表单独存储'B''A'
列中的每个值:
tReduction.tCategories
因此,条件成为
CREATE TABLE dbo.ReductionCategory (
... pk ...,
ReductionCode INT NOT NULL REFERENCES dbo.tReduction(ReductionCode), -- FK
CategoryCode INT NOT NULL REFERENCES dbo.tCategories(CategoryCode) -- FK
)