【问题标题】:How do I use SQL wildcards conditionally?如何有条件地使用 SQL 通配符?
【发布时间】:2019-10-11 06:50:15
【问题描述】:

我正在尝试一个未返回所需结果的查询。

SELECT [ID], [bookno], [ECN] AS [Version No], [InsertedDate] AS [Add Date]
FROM [BooksBank]
WHERE [Flag] IS NULL AND [bookno] LIKE '%60003-74P00-F%'
AND [ECN] IN 
(SELECT MAX(ECN) FROM [BooksBank]
WHERE [Flag] is NULL AND [bookno] LIKE '%60003-74P00-F%');

它正在返回以下结果

75822 | 60003-74P00-F2_511-7434.pdf | 20190527 | 2019-05-28 00:00:00.000

而不是下面这也是想要的结果

74967 | 60003-74P00-F_55S-0389.pdf | 20190213 | 2019-02-14 00:00:00.000

这种行为在技术上是正确的,但我想要这个结果

60003-74P00-F_55S-0389.pdf

请帮忙。

【问题讨论】:

  • 最后一个条件是什么?目前,它只是将您的匹配列表减少为具有最高 ECN 的单个匹配... (删除 AND ECN IN(SELECT MAX(ECN) FROM blah) 可能是您想要的修复,但您没有解释为什么,但它在第一个地点。)
  • 它正在产生具有最高ECN的结果,即版本或版本。这是一项要求,无法更改。
  • 那么您的要求有问题:您想要具有最高 ECN 的 SINGLE 匹配记录,但您还希望返回第二条记录(它不会具有最高 ECN)。
  • 是的,差不多就是这样。有人搞砸了导致这种情况的命名约定。无法编辑行,无法删除 max(ecn) - 现在,您是说存在死锁且无法解决?
  • 您的要求毫无意义。你说你想要两条记录,但只有一条具有最高 ECN 的记录。你想要两张还是一张?你不能同时拥有它。

标签: sql sql-server database tsql


【解决方案1】:

你的模式太随和了。你想匹配F_但不匹配F2_

一种方法是在您要搜索的字符串中包含_(因为_ 是“任何单个字符”的符号,您需要“转义”它。)

将两种模式更改为...

'%60003-74P00-F\_%' ESCAPE '\'

【讨论】:

    【解决方案2】:

    您的通配符搜索“%60003-74P00-F%”将导致每个 bookno 都有“60003-74P00-F”作为子字符串。如果您想要专门针对特定书籍,您可以使用 = 而不是通配符。

    你可以试试这个:

    SELECT ID, bookno, InsertedDate AS Add Date,max(ECN) AS Version No, 来自书库 WHERE [Flag] 为 NULL AND [bookno] = '60003-74P00-F_55S-0389.pdf' 按 ID、bookno、InsertedDate 分组

    【讨论】:

    • 是的。只是用户不知道全名,只知道下划线前的名字,60003-74P00-F。这就是为什么我不能接受你的建议。
    • 那么你可以简单地使用 [bookno] LIKE '60003-74P00-F_%'
    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2010-09-20
    相关资源
    最近更新 更多