首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将字符串更改为最小/最大值以生成中间值

将字符串更改为最小/最大值以生成中间值
EN

Stack Overflow用户
提问于 2017-02-22 00:58:56
回答 3查看 95关注 0票数 1

编辑:我意识到我试图编辑的字段是nvarchar(max),并且包含大量的垃圾数据,并且我试图使用的扩展都是单一的角色,因为逗号分隔的values...it不太可能完成我所请求的操作。非常感谢所有帮助过我们的人!

在我问之前,要知道我对数据库有只读访问权限,不能写入临时tables...as,这是我想过的一个解决方案……

我目前正在使用以下查询:

代码语言:javascript
运行
复制
USE Database
GO
DECLARE @dn VARCHAR(13)
SET @dn = '%15555555555%'
SELECT switch_extension, line_number, system_configurations.name, system_configurations.description, lines.system_id
FROM lines, system_configurations
WHERE lines.system_id=system_configurations.system_id
AND switch_extension like @dn
AND lines.status = 1

SELECT distinct CS.name, CTD.cti_data_value
FROM cti_source AS CS with (nolock)
  JOIN cti_source_data AS CTD with (nolock)ON CS.cti_source_id = CTD.cti_source_id
--WHERE CS.status = 1 
    AND (CTD.cti_data_name = 'Agent_Ext'or CTD.cti_data_name = 'IVR_Ext') 
    AND CTD.cti_data_value LIKE @dn

问题是,CTD.cti_data_value可以包含以字符串形式存储的范围,而不是具有单个值的新行,例如'15551112222-15551113333‘,而不是15551112222,15551112223,...

如果我查询这个范围内的@dn (除非是该范围的开始或结束),则不会得到任何结果(在上面的示例中,如果我搜索15551112345,则不会有任何结果,即使它存在于“范围”中)。

有没有办法改变这一点,在这个单独的字符串中得到min/max,然后找到min/max之间的结果,或者我是不是遇到了麻烦?

EN

Stack Overflow用户

发布于 2017-02-22 01:33:38

您需要将CTD.cti_data_value中的值拆分为范围的下限和上限。更改where子句中的此行...

代码语言:javascript
运行
复制
AND CTD.cti_data_value LIKE @dn

对这个..。

代码语言:javascript
运行
复制
AND @dn BETWEEN
    CASE WHEN  CHARINDEX('-', CTD.cti_data_value) > 0 THEN
        SUBSTRING(CTD.cti_data_value, 1,  CHARINDEX('-', CTD.cti_data_value) - 1)
    ELSE
        CTD.cti_data_value
    END 
  AND 
    CASE WHEN  CHARINDEX('-', CTD.cti_data_value) > 0 THEN
        SUBSTRING(CTD.cti_data_value, CHARINDEX('-', CTD.cti_data_value) + 1, LEN(CTD.cti_data_value) - CHARINDEX('-', CTD.cti_data_value))
    ELSE
        CTD.cti_data_value
    END

这将适应具有一系列值(例如X-Y)或仅具有单一值的情况。我必须警告您,比较字符串变量(例如CHAR、VARCHAR等)中的数值。可能导致不可预知的结果。例如,当比较字符串变量中的数值时,"2“大于"10”。

如果您绝对确定CTD.cti_data_value中的数字将始终是相同的位数,那么您就可以了。如果不是这样,您应该将数值转换为INT (或适合您的情况的任何值),如下所示...

代码语言:javascript
运行
复制
AND CONVERT(INT, @dn) BETWEEN
    CONVERT(INT, CASE WHEN  CHARINDEX('-', CTD.cti_data_value) > 0 THEN
        SUBSTRING(CTD.cti_data_value, 1,  CHARINDEX('-', CTD.cti_data_value) - 1)
    ELSE
        CTD.cti_data_value
    END)
  AND 
    CONVERT(INT, CASE WHEN  CHARINDEX('-', CTD.cti_data_value) > 0 THEN
        SUBSTRING(CTD.cti_data_value, CHARINDEX('-', CTD.cti_data_value) + 1, LEN(CTD.cti_data_value) - CHARINDEX('-', CTD.cti_data_value))
    ELSE
        CTD.cti_data_value
    END)
票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42373472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档