【问题标题】:Searching within a SQL query在 SQL 查询中搜索
【发布时间】:2020-05-19 00:32:13
【问题描述】:

我试图让我的查询使用 where 子句来查找从将特定列转换为 varbinary 和 varchar 的查询返回的信息。我必须转换,因为原始数据是十六进制的。

我的查询:

SELECT ScriptID, RowOrder, cast(cast(ScriptData as varbinary(max)) as varchar(max)) AS Converted_SD
FROM Script_Data

典型的回报是这样的:

--------------------------------------------------------------------------------------------
| ScriptID | RowOrder | Converted_SD                                                       |
--------------------------------------------------------------------------------------------
| 5006     | 1        | CVisScript {331 1 76 "\"1007\"" "Call.PeripheralVariable10" 284 "" |
| 5007     | 1        | CVisScript {332 1 76 "\"2007\"" "Call.PeripheralVariable10" 285 "" |
| 5009     | 1        | CVisScript {333 1 76 "\"1037\"" "Call.PeripheralVariable10" 286 "" |
| 5014     | 1        | CVisScript {334 1 76 "\"1407\"" "Call.PeripheralVariable10" 287 "" |
| 5015     | 1        | CVisScript {335 1 76 "\"1068\"" "Call.PeripheralVariable10" 288 "" |
| 5016     | 1        | CVisScript {336 1 76 "\"6578\"" "Call.PeripheralVariable10" 289 "" |
--------------------------------------------------------------------------------------------

我希望能够返回 ScriptID、RowOrder,但只返回 Call.PeripheralVariable10 和前面的四个数字 - Converted_SD 列中没有其他内容。我已经尝试了这么多子查询,但我似乎无法将一个可行的放在一起。所以我设想它看起来像这样:

--------------------------------------------------------
| ScriptID | RowOrder | Converted_SD                   |
--------------------------------------------------------
| 5006     | 1        | 1007 Call.PeripheralVariable10 |
| 5007     | 1        | 2007 Call.PeripheralVariable10 |
| 5009     | 1        | 1037 Call.PeripheralVariable10 |
| 5014     | 1        | 1407 Call.PeripheralVariable10 |
| 5015     | 1        | 1068 Call.PeripheralVariable10 |
| 5016     | 1        | 6578 Call.PeripheralVariable10 |
--------------------------------------------------------

谢谢

【问题讨论】:

  • 道歉...我正在使用 MS SQL Server 2016

标签: sql sql-server subquery varchar varbinary


【解决方案1】:

如果您使用的是 SQL Server 2016,您可以使用 string_split 函数。

您可以在此处查看其用法 (https://www.mssqltips.com/sqlservertip/4884/sql-server-2016-stringsplit-function/)

如果您知道格式始终是带双引号的调用,您可以在双引号中使用此功能,或者如果您有多个带有替换的格式,则可以使用相同的分隔符。

with cte as  (
select 5006 as ScriptID,  1 RowOrder, 'CVisScript {331 1 76 "\"1007\"" "Call.PeripheralVariable10" 284 ""' as Con_SD union all 
select 5007 as ScriptID,  1 RowOrder, 'CVisScript {332 1 76 "\"2007\"" "Call.PeripheralVariable10" 285 ""' as Con_SD union all 
select 5009 as ScriptID,  1 RowOrder, 'CVisScript {333 1 76 "\"1037\"" "Call.PeripheralVariable10" 286 ""' as Con_SD union all 
select 5014 as ScriptID,  1 RowOrder, 'CVisScript {334 1 76 "\"1407\"" "Call.PeripheralVariable10" 287 ""' as Con_SD union all 
select 5015 as ScriptID,  1 RowOrder, 'CVisScript {335 1 76 "\"1068\"" "Call.PeripheralVariable10" 288 ""' as Con_SD union all 
select 5016 as ScriptID,  1 RowOrder, 'CVisScript {336 1 76 "\"6578\"" "Call.PeripheralVariable10" 289   ' as Con_SD )


select c.ScriptID, c.RowOrder, tbl.n   from cte c  
cross apply  (select * from  string_split (con_SD, '"'))   tbl(n)
where tbl.n like '%call%';

输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2016-09-10
    • 2016-01-06
    • 2010-12-03
    • 2015-03-09
    • 2011-12-06
    相关资源
    最近更新 更多