简体   繁体   English

如果Select inside SQL IN语句返回NULL,则选择ALL

[英]If Select inside SQL IN statement returns NULL then select ALL

I'm trying to shorten my code and make it faster. 我正在尝试缩短代码并使其更快。 However, I am struggling a bit with this statement. 但是,我对此声明有些挣扎。 I want it to return all news if the value page_category is not set. 如果未设置值page_category我希望它返回所有新闻。

page_category is set in the DB as 1,2,3,4 and each news article has 1 category like below. 在数据库page_category设置为1,2,3,4 ,每则新闻文章都有1个类别,如下所示。

Page Category 页面类别

页面类别

News Category 新闻分类

新闻

I want to fetch each news article that has the category id within page_category . 我想获取在page_category中具有类别ID的每则新闻文章。

This is my statement, and it works fine for whenever page_category is set. 这是我的声明,每当设置page_category时,它都可以正常工作。

"AND n.news_category IN (SELECT page_category FROM pages WHERE page_name = :pagename AND page_deleted IS NULL)";

How can I rewrite this so that n.news_category does not count if return is NULL ? 我该如何重写它,以便如果return为NULL n.news_category不计数?

This is my whole current statement: 这是我目前的全部声明:

 $sql = "SELECT n.news_title, n.news_content, n.news_published_dt "
      . "FROM news n "
      . "LEFT JOIN languages l "
      . "ON n.news_lang = l.language_id "
      . "WHERE ((l.language_val = :language) OR (n.news_lang_all IS NOT NULL)) "
      . "AND n.news_deleted IS NULL "
      . "AND n.news_published = 1 "
      . "AND n.news_category IN (SELECT page_category FROM pages WHERE page_name = :pagename AND page_deleted IS NULL)";

Assuming that page_category takes on a NULL value and you want all rows in that case, then use exists instead: 假设page_category上取NULL值,并且要在这种情况下,所有的行,然后使用exists代替:

EXISTS (SELECT 1
        FROM pages p
        WHERE p.page_name = :pagename AND p.page_deleted IS NULL AND
              (p.page_category is null or p.page_cateogry = n.news_category)
       )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM