Multiple NOT LIKE in sql server

我是研究僧i 提交于 2021-02-10 07:46:42

问题


I have a table like

+--------+-------+
| id     | name  |
+--------+-------+
| 302345 | Name1 |
| 522345 | Name2 |
| 1X2345 | Name3 |
| 2X2345 | Name4 |
| 1X8765 | Name5 |
| 2X2123 | Name6 |
| 502345 | Name7 |
| M62345 | Name8 |
+--------+-------+

I want to take id that doesn't have prefix 30,1X,2X. Like this I have more than 20 prefix to be excluded. I was using NOT LIKE 20 times and looking to shorten it. From some of stackoverflow question, I have found we can create a table and store all these values in a column and use that. But in my case I don't have permission to create table. Hence tried the below code but it is giving strange results.

SELECT *
FROM mytable
INNER JOIN (
    SELECT '30%' Prefix
    UNION ALL
    SELECT '50%'
    UNION ALL
    SELECT '1X%'
    ) list ON id NOT LIKE prefix

FIDDLE HERE . Please suggest some alternative.

Expected output

+--------+-------+
| id     | name  |
+--------+-------+
| 522345 | Name2 |
+--------+-------+
| 502345 | Name7 |
+--------+-------+
| M62345 | Name8 |
+--------+-------+

回答1:


You could use a NOT EXISTS with a VALUES construct for all your prefixes.

Something like this:

SELECT *
FROM mytable mt
WHERE NOT EXISTS (SELECT 1
                  FROM (VALUES('30%'),('50%'),('1X%'),('2X%')/*,...*/)V(expr)
                  WHERE mt.id LIKE V.expr);


来源:https://stackoverflow.com/questions/63899521/multiple-not-like-in-sql-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!