哪个语句将使用concat

时间:2015-07-13 09:43:19

标签: mysql sql

SELECT zlec_status.nazwa                       AS Status, 
       piorytet.nazwa                          AS Priorytet, 
       Concat(koord.imie, ' ', koord.nazwisko) AS `Koordynator`, 
       Concat(zlec_adresy.town, ' - ', zlec_adresy.street, ' ', 
       zlec_adresy.other) 
                                               AS `adres`, 
       zlec_z_dnia,zlec_id, 
       zlec_nr, 
       zlec_do, 
       zlec_ogran, 
       awizacje, 
       awizacja_na_dzien, 
       termin_zamkniecia, 
       tresc, 
       uwagi 
FROM   zlec 
       INNER JOIN koord 
               ON zlec.koord = koord.id 
       INNER JOIN zlec_adresy 
               ON zlec.zlec_addres = zlec_adresy.id 
       INNER JOIN piorytet 
               ON zlec.priorytet = piorytet.id 
       INNER JOIN zlec_status 
               ON zlec.status_zlecenia = zlec_status.id 
WHERE  `zlec_adresy`.`town` LIKE  '%Sz%' LIMIT 0, 10

表格zlec_adresy如下:

=============================   
id | street | town | other
=============================

如您所见,整个地址部分有一个连续

Concat(zlec_adresy.town, ' - ', zlec_adresy.street, ' ',zlec_adresy.other)AS `adres`

开始 - 用户有一个带有地址查询的输入字段 - 因此他可以写出城镇名称或街道名称或其他条件。在我的代码中,只会通过。' town'的WHERE子句进行过滤。像用户输入一样。但是我怎样才能使它工作=> Where ||Concat(zlec_adresy.town, ' - ', zlec_adresy.street, ' ',zlec_adresy.other)AS {ADRES {1}}

所以基本上它会过滤where语句的As || LIKE userinput。这可能吗?或者还有另一种方法可以实现它。

4 个答案:

答案 0 :(得分:1)

WHERE 
Concat(zlec_adresy.town, ' - ', zlec_adresy.street, ' ', 
       zlec_adresy.other) like concat('%',@variable,'%')

答案 1 :(得分:1)

另一种可能更干净的方法是使用OR

WHERE
  town like concat('%',@userinput,'%')
OR
  street like concat('%',@userinput,'%')
OR 
  other like concat('%',@userinput,'%')

答案 2 :(得分:1)

您可以使用HAVING来解决您的问题。就像是 : SELECT name, CONCAT(street, ' ', town) AS address FROM zlec WHERE zlec.town like '%abc%' HAVING address like '%xyz%'

答案 3 :(得分:1)

查询解剖结构如下所示:

  • 它处理from,因为所有其他子句都依赖于它
  • 它处理where,以过滤掉不需要的行
  • 它处理select,因此您将获得所需的列

请注意,我没有提到group byhavingorder by,因为它们不是您查询的一部分,因此这个解剖结构非常简单。这种简化的目的是为了达到清晰度。

现在,由于selectwhere之后运行,因此您无法使用selectwhere的重命名,因为where是执行后,选择尚未执行。

所以你必须做一个解决方法: - 您可以通过(select ...) mynewrelation定义临时新关系并使用newrelation的列重命名,但不建议这种情况。但是,了解此选项很有用,它可能在将来有用 - 你可以使用像Madhivanan建议的那样的东西,但是这个解决方案不是高效的,因为你正在进行非常慢的字符串操作来连接这些字段。因此,代码将清晰但缓慢 - Hanno Binder的解决方案要好得多,因为如果第一个操作数为真,它会使用or不评估第二个操作数的好处。他的代码很快,但你不想看到它

我的建议:您应该定义stored function来进行此计算。该存储函数应该等同于Hanno Binder建议的解决方案,您只需在查询中调用该函数即可。因此,您的源代码将清晰,易于阅读,正确且高效。