别名结果用于where子句

时间:2019-10-14 07:16:49

标签: sql

你好,我想使用别名结果作为SQL查询中的where子句。 以下是我的SQL查询。

SELECT SQL_CALC_FOUND_ROWS
   `id`, 
   `number`,
   `ref_no`, 
    CONCAT(" cosid LIKE '%",REPLACE(abc_cosing, ',',"%' OR cosid LIKE '%"),"%'") AS TEST,
    (SELECT COUNT(id) 
    FROM `tbl_data_pub` 
    WHERE TEST ) AS TOTALREC FROM `tbl_data_main` as aa LEFT JOIN tbl_ref_table as bb on aa.id=bb.abc_id WHERE ref_no='12345'

我正在将TEST的值表示为“ 12345%”或cosid LIKE'%32837%'或cosi _...”,我想在where子句中对此赞一下。但是我该怎么办?

3 个答案:

答案 0 :(得分:1)

尝试一下:

select * from
(
SELECT SQL_CALC_FOUND_ROWS
       `ing_id`, 
       `ing_cas_no`,
       `ing_cosing_ref_no`, 
       REPLACE(aig_addi_all_cosing, ',',"%' OR usf_eu_cosing_id LIKE '%") AS TEST,
       (SELECT COUNT(usf_id) 
        FROM `tbl_USFDA_published` 
        WHERE (usf_eu_cosing_id LIKE TEST)) AS USFDAREG 
FROM `tbl_ingredients` as aa 
LEFT JOIN tbl_ing_addi_cosing_ref as bb on aa.ing_id=bb.aig_ing_id
WHERE ing_cosing_ref_no='38617'
)
where TEST like '%xxx%'

答案 1 :(得分:0)

您可以通过使用CTE获得结果。 “ Where”子句不允许使用别名。在下面的查询中尝试此操作将有所帮助。

  deleteFromList(forDeletion, myList) {
      myList = myList.filter(item => item !== forDeletion);                 
  }

答案 2 :(得分:0)

MySQL扩展了having子句的使用,使其在非聚合查询中的行为类似于where。您可以使用:

SELECT SQL_CALC_FOUND_ROWS ing_id, ing_cas_no, ing_cosing_ref_no, 
       REPLACE(aig_addi_all_cosing, ',',"%' OR usf_eu_cosing_id LIKE '%") AS TEST,
       (SELECT COUNT(usf_id) 
        FROM `tbl_USFDA_published` 
        WHERE (usf_eu_cosing_id LIKE TEST)) AS USFDAREG 
FROM tbl_ingredients i LEFT JOIN
     tbl_ing_addi_cosing_ref acr
     ON i.ing_id = acr.aig_ing_id
WHERE ing_cosing_ref_no = 38617
HAVING test LIKE '%AAA%';

MySQL具有此扩展的充分理由。有两个原因是FROM子句中的视图不允许子查询。而且,MySQL倾向于实现子查询-这增加了额外的开销-并且避免了这种开销。

其他一些注意事项:

  • 请勿不必要地使用反引号。您不需要对列或表的名称进行转义,因此不必理会。
  • 使用有意义的表别名,而不是随机字母。这意味着表名的缩写。
  • 限定查询中的所有列名称。我还没有这样做,因为我不知道这些列来自哪里。
  • 大概ing_cosing_ref_no是一个数字。将值与 number 而不是字符串进行比较。