sql 服务器中的多个 NOT LIKE
Multiple NOT LIKE in sql server
我有一个table喜欢
+--------+-------+
| id | name |
+--------+-------+
| 302345 | Name1 |
| 522345 | Name2 |
| 1X2345 | Name3 |
| 2X2345 | Name4 |
| 1X8765 | Name5 |
| 2X2123 | Name6 |
| 502345 | Name7 |
| M62345 | Name8 |
+--------+-------+
我想获取没有前缀 30
、1X
、2X
的 id。像这样我有超过 20 个前缀要排除。我使用 NOT LIKE
20 次并希望缩短它。从一些 Whosebug 问题中,我发现我们可以创建一个 table 并将所有这些值存储在一个列中并使用它。但就我而言,我没有创建 table 的权限。因此尝试了下面的代码,但它给出了奇怪的结果。
SELECT *
FROM mytable
INNER JOIN (
SELECT '30%' Prefix
UNION ALL
SELECT '50%'
UNION ALL
SELECT '1X%'
) list ON id NOT LIKE prefix
FIDDLE HERE。请提出一些替代方案。
预期输出
+--------+-------+
| id | name |
+--------+-------+
| 522345 | Name2 |
+--------+-------+
| 502345 | Name7 |
+--------+-------+
| M62345 | Name8 |
+--------+-------+
您可以将 NOT EXISTS
与 VALUES
构造一起用于所有前缀。
像这样:
SELECT *
FROM mytable mt
WHERE NOT EXISTS (SELECT 1
FROM (VALUES('30%'),('50%'),('1X%'),('2X%')/*,...*/)V(expr)
WHERE mt.id LIKE V.expr);
我有一个table喜欢
+--------+-------+
| id | name |
+--------+-------+
| 302345 | Name1 |
| 522345 | Name2 |
| 1X2345 | Name3 |
| 2X2345 | Name4 |
| 1X8765 | Name5 |
| 2X2123 | Name6 |
| 502345 | Name7 |
| M62345 | Name8 |
+--------+-------+
我想获取没有前缀 30
、1X
、2X
的 id。像这样我有超过 20 个前缀要排除。我使用 NOT LIKE
20 次并希望缩短它。从一些 Whosebug 问题中,我发现我们可以创建一个 table 并将所有这些值存储在一个列中并使用它。但就我而言,我没有创建 table 的权限。因此尝试了下面的代码,但它给出了奇怪的结果。
SELECT *
FROM mytable
INNER JOIN (
SELECT '30%' Prefix
UNION ALL
SELECT '50%'
UNION ALL
SELECT '1X%'
) list ON id NOT LIKE prefix
FIDDLE HERE。请提出一些替代方案。
预期输出
+--------+-------+
| id | name |
+--------+-------+
| 522345 | Name2 |
+--------+-------+
| 502345 | Name7 |
+--------+-------+
| M62345 | Name8 |
+--------+-------+
您可以将 NOT EXISTS
与 VALUES
构造一起用于所有前缀。
像这样:
SELECT *
FROM mytable mt
WHERE NOT EXISTS (SELECT 1
FROM (VALUES('30%'),('50%'),('1X%'),('2X%')/*,...*/)V(expr)
WHERE mt.id LIKE V.expr);