逗号后的数字通配符列表并加入单个值
Wildcard list of numbers after comma and join on single value
我有 TABLE A,其中一列包含单个值,TABLE B,其中一列包含可能的匹配值列表。
我的代码似乎只获取列表中的第一项,但不会在列表中更深入地查找匹配编号。
你能帮我改进以下代码吗:
select Logs.SingleValue,
Instances.list from Logs,Instances
where Logs.Column1=Instances.DeviceNumber and
(',' + RTRIM(Instances.list) + ',') LIKE Logs.SingleValue
列表中的数据看起来像
106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120
或
3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360
我使用 SQL 和 R 编程环境,不确定是天气 MS SQL 还是 ORACLE 的版本。我所知道的是我发现了类似的情况并且命令不起作用所以它需要在纯 SQL.
中手工编写
提前致谢
语法类似于 t-sql,表示它是 MS Sql 服务器。
我能给你的最好建议是标准化你的数据库——去掉那个逗号分隔的列并将它移到 table.
阅读Is storing a delimited list in a database column really that bad?,你会看到很多原因,为什么这个问题的答案是绝对是!
如果您不能这样做,您可能应该将当前的 sql 代码更改为如下内容:
select Logs.SingleValue, Instances.list
from Logs
inner join Instances ON Logs.Column1 = Instances.DeviceNumber
and (', ' + RTRIM(Instances.slotlist2) + ',') LIKE '%, '+ Logs.Column2 +',%'
通过这种方式,您应该能够获取列表中某处 slotlist2
的编号在 Column2
中的所有记录。
请注意 like
运算符两边第一个逗号后的 space。
另请注意,我已将您的隐式连接更改为显式连接。
由于显式连接已成为 ANSI SQL 的一部分超过 25 年,并且每个自尊的 rdbms 都支持它们,因此实际上不再需要使用隐式连接。
编辑:我测试了我的查询,它似乎工作正常。
You can look at it yourself on rextester.
Result of most recent Query
因此在屏幕截图上,R studio 中的查询或包似乎存在问题,允许在没有数据库的情况下对 CSV 文件进行操作SQL。
亲切的问候
多米尼克
P.S。原始 post 包含重命名的列名只是为了简化我在解决后的情况。
我有 TABLE A,其中一列包含单个值,TABLE B,其中一列包含可能的匹配值列表。
我的代码似乎只获取列表中的第一项,但不会在列表中更深入地查找匹配编号。
你能帮我改进以下代码吗:
select Logs.SingleValue,
Instances.list from Logs,Instances
where Logs.Column1=Instances.DeviceNumber and
(',' + RTRIM(Instances.list) + ',') LIKE Logs.SingleValue
列表中的数据看起来像
106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120
或
3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360
我使用 SQL 和 R 编程环境,不确定是天气 MS SQL 还是 ORACLE 的版本。我所知道的是我发现了类似的情况并且命令不起作用所以它需要在纯 SQL.
中手工编写提前致谢
语法类似于 t-sql,表示它是 MS Sql 服务器。
我能给你的最好建议是标准化你的数据库——去掉那个逗号分隔的列并将它移到 table.
阅读Is storing a delimited list in a database column really that bad?,你会看到很多原因,为什么这个问题的答案是绝对是!
如果您不能这样做,您可能应该将当前的 sql 代码更改为如下内容:
select Logs.SingleValue, Instances.list
from Logs
inner join Instances ON Logs.Column1 = Instances.DeviceNumber
and (', ' + RTRIM(Instances.slotlist2) + ',') LIKE '%, '+ Logs.Column2 +',%'
通过这种方式,您应该能够获取列表中某处 slotlist2
的编号在 Column2
中的所有记录。
请注意 like
运算符两边第一个逗号后的 space。
另请注意,我已将您的隐式连接更改为显式连接。
由于显式连接已成为 ANSI SQL 的一部分超过 25 年,并且每个自尊的 rdbms 都支持它们,因此实际上不再需要使用隐式连接。
编辑:我测试了我的查询,它似乎工作正常。
You can look at it yourself on rextester.
Result of most recent Query
因此在屏幕截图上,R studio 中的查询或包似乎存在问题,允许在没有数据库的情况下对 CSV 文件进行操作SQL。
亲切的问候
多米尼克
P.S。原始 post 包含重命名的列名只是为了简化我在解决后的情况。