SQL中是否有“LIKE”和“IN”的组合?

新手上路,请多包涵

在 SQL 中,我(很遗憾)经常不得不使用“ LIKE ”条件,因为数据库违反了几乎所有的规范化规则。我现在无法改变。但这与问题无关。

此外,我经常使用 WHERE something in (1,1,2,3,5,8,13,21) 类的条件来提高我的 SQL 语句的可读性和灵活性。

有没有可能在不编写复杂的子选择的情况下将这两件事结合起来?

我想要像 WHERE something LIKE ('bla%', '%foo%', 'batz%') 这样简单的东西,而不是这样:

 WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'

我在这里与 SQl Server 和 Oracle 合作,但我很感兴趣,如果这在任何 RDBMS 中都是可能的。

原文由 selfawaresoup 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

SQL 中没有 LIKE 和 IN 的组合,更不用说 TSQL (SQL Server) 或 PLSQL (Oracle)。部分原因是因为全文搜索 (FTS) 是推荐的替代方法。

Oracle 和 SQL Server FTS 实现都支持 CONTAINS 关键字,但语法仍然略有不同:

甲骨文:

 WHERE CONTAINS(t.something, 'bla OR foo OR batz', 1) > 0

SQL 服务器:

 WHERE CONTAINS(t.something, '"bla*" OR "foo*" OR "batz*"')

您要查询的列必须是全文索引。

参考:

原文由 OMG Ponies 发布,翻译遵循 CC BY-SA 4.0 许可协议

T-SQL 中,此选项有效,但速度不是很快:

 CREATE FUNCTION FN_LIKE_IN (@PROC NVARCHAR(MAX), @ITENS NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN

        --Search an item with LIKE inside a list delimited by "," Vathaire 11/06/2019

    DECLARE @ITEM NVARCHAR(MAX)
    WHILE CHARINDEX(',', @ITENS) > 0 BEGIN
        SET @ITEM = LEFT(@ITENS, CHARINDEX(',', @ITENS) - 1)
        --IF @ITEM LIKE @PROC
        IF @PROC LIKE @ITEM
            RETURN @PROC --@ITEM --1
        ELSE
            SET @ITENS = STUFF(@ITENS, 1, LEN(@ITEM) + 1, '')
    END
    IF @PROC LIKE @ITENS RETURN @PROC --@ITEM --1
    RETURN NULL --0
END

询问:

 SELECT * FROM SYS.PROCEDURES
WHERE DBO.FN_LIKE_IN(NAME, 'PRC%,SP%') IS NOT NULL

原文由 Erick de Vathaire 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进