【问题标题】:SQL Get TRUE if two strings share any character如果两个字符串共享任何字符,SQL 获取 TRUE
【发布时间】:2016-08-10 05:22:01
【问题描述】:

我想知道,如果有一个技巧来获得两个字符串比较的布尔/位结果,其中 TRUE 值将在存在两个字符串。

一个字符串是授予访问权限的用户列表(即“OTV”,存储在用户配置文件中),另一个是有权访问对象的组列表(即“MDSKTUQ”,存储在记录中的 DB 中) .每个字符都是一个用户组的名称。

在真正的 SQL 查询中,我想返回行,其中包含授予用户的任何组。比如:

-- Following should display all files attached to record 145
-- to which has the user granted access:
SELECT FileCaption, FileName, FileType, Category FROM DocFiles 
WHERE RecordID = 145 AND CONTAINS(GroupsRead, <<list_of_groups_string>>)

我有一个客户端解决方案,但可行的 SQL 端解决方案会更整洁、更安全。 欢迎评论和讨论。

问候,

橡木

【问题讨论】:

  • 您能否添加一些示例表数据,以及预期的结果。并标记使用的 dbms。
  • SQL 不是 dbms。标记您正在使用的 DBMS?\
  • 在设计数据库时通常不赞成多值字段是有原因的,这正是因为对这些字段的查询变得很麻烦,或者在某些情况下完全不可能进行。如果可以,您应该考虑将该字段提取到一个单独的表中,每个组或用户一行。
  • 对不起标签,我希望我现在做对了(sql-server-2012)
  • 绝对可行,但难度取决于 RDBMS。 This reference 可能会有所帮助。我会亲自查看 SUBSTRLOCATE 函数来执行此操作。

标签: sql sql-server-2012 contains string-comparison


【解决方案1】:

给你 - 新闻!

ALTER FUNCTION StringContainsCharactersFrom 
(
    -- Add the parameters for the function here
    @source varchar(100),
    @candidate varchar(100)
)
RETURNS bit
AS
BEGIN

    declare @candidatePos int = 1;
    while (@candidatePos <= len(@candidate))
    BEGIN

        declare @candidateLetter varchar = substring(@candidate, @candidatePos, 1);
        if (CHARINDEX(@candidateLetter,@source, 1) > 0)
            return 1;
        set @candidatePos = @candidatePos + 1;
    END
    return 0;

END
GO

【讨论】:

  • 像魅力一样工作!即:WHERE ...... AND dbo.stringContainsCharactersFrom('OMT',DL.GroupsRead) = 1
猜你喜欢
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多