WHERE查询中的字符串

时间:2012-12-20 09:39:34

标签: mysql coldfusion

所以我有这个让我头疼的问题。感谢任何人都可以帮我解决这个问题。

我正在将Coldfusion与MSSQL和MySQL一起使用。 MSSQL数据库是我正在处理的这个应用程序的主要数据源。虽然MySQL用于员工数据库(它是为了使用PHP开发员工的数据库而创建的)。我必须连接到它才能使这个应用程序工作。

MySQL表:

TBL_EMPLOYEE

+---------+------------------+-------------------|
|EMP_ID   |    EMP_NUMBER    |    DATE_OF_BIRTH  |
+---------+------------------+-------------------|
| 1       |    00001         |    2009-01-01     |
| 2       |    00002         |    2009-01-15     |
| 3       |    TEMP01        |    2009-05-10     |  
| 4       |    TEMP02        |    2010-02-04     |
| 5       |    0006          |    2010-03-01     |
+---------+------------------+-------------------|

TBL_CHILD

+---------+------------------+---------------------|
|EMP_ID   |    CHILD_ID      |    DATE_OF_BIRTH    |

+---------+------------------+---------------------|
| 1       |    1             |    2008-11-12       |
| 1       |    2             |    2010-10-06       |
| 2       |    3             |    2009-05-10       |
| 5       |    4             |    2010-02-16       |
| 5       |    5             |    2012-03-08       |
+---------+------------------+---------------------|

此应用程序将检查员工的DOB。如果他有孩子,系统将显示他的大孩子的DOB。否则(如果他没有孩子)系统将显示他自己的DOB。

问题在于:

<cfquery name="getEmployee" datasource="#mysqlDB#">
    SELECT EMP_ID,EMP_NUMBER,DATE_OF_BIRTH
    FROM   TBL_EMPLOYEE
    WHERE   EMP_NUMBER = '#users.EMP_NO[mainRow]#'
</cfquery>

<cfset mysql_id = getEmployee.EMP_ID>

<cfquery name="getChild" datasource="#mysqlDB#">
    SELECT *
    FROM   TBL_CHILD
    WHERE  EMP_ID =#mysql_id#
    ORDER BY DATE_OF_BIRTH ASC
    LIMIT 1
</cfquery>


Note : 
#users.EMP_NO[mainRow]# --> loop query from MSSQL
EMP_NUMBER = string
EMP_ID = integer (auto)

当员工编号为数字(即:001,101,23002等)时,此查询有效 (没有''符号)

<cfquery name="getEmployee" datasource="#mysqlDB#">
    SELECT *
    FROM    TBL_EMPLOYEE
    WHERE EMP_NUMBER = #users.EMP_NO[mainRow]#
</cfquery>

<cfset mysql_id = getEmployee.EMP_ID>

<cfquery name="getChild" datasource="#mysqlDB#">
    SELECT *
    FROM   TBL_CHILD
    WHERE  EMP_ID =#mysql_id#
</cfquery>

但是当员工编号为字符(TEMP101,TEMP007等)时,它会给我错误。

 '#users.EMP_NO[mainRow]#'

我试过在phpmyadmin中使用相同的查询,它运行得很好。任何人都可以告诉我为什么会发生这种情况以及如何解决这个问题?

(从评论中更新) 错误消息是:

  

执行数据库查询时出错。您的SQL语法有错误;   检查与您的MySQL服务器版本对应的手册   正确的语法在'*第3行SELECT * FROM TBL_CHILD WHERE附近使用   EMP_ID =

4 个答案:

答案 0 :(得分:3)

应该加入这些mySQL查询,而不是每个员工两次访问数据库。它将解决导致错误的第二个查询,然后您只需担心此查询返回0结果。

这样的东西
<cfquery name="getEmployee" datasource="#mysqlDB#">
  SELECT 
    [only the columns you need from both tables]
  FROM 
    TBL_EMPLOYEE
    inner join tbl_child on tbl_employee.emp_id = tbl_child.emp_id
  WHERE 
    tbl_employee.EMP_NUMBER = <cfqueryparam cfsqltype="cf_sql_varchar" value="#users.EMP_NO[mainRow]#">
</cfquery>

您还可以使用in

在一个查询中返回所有员工
WHERE 
        tbl_employee.EMP_NUMBER in (<cfqueryparam cfsqltype="cf_sql_varchar" value="#valueList(users.EMP_NO)#" list="yes">)

答案 1 :(得分:2)

有时候getEmployee很可能无法返回数据。因此,在您的第二个查询中#mysql_id#将不输出任何内容。要解决此问题,您可以放置​​引号并使用以下查询:

<cfquery name="getChild" datasource="#mysqlDB#">
SELECT *
FROM TBL_CHILD
WHERE EMP_ID = '#mysql_id#'
</cfquery>

当然,这只解决了运行时错误,但您很可能也面临数据问题。

答案 2 :(得分:2)

根据您的后续评论详细说明实际错误:

  

@AdamCameron:执行数据库查询时出错。你有错误   你的SQL语法;查看与MySQL对应的手册   服务器版本,用于在第3行SELECT'附近使用正确的语法*   FROM TBL_CHILD WHERE EMP_ID =

它向我建议你给我们一个关于情况所在的略微乞求的蠢事。它不在EMP_NUMBER,而是与EMP_ID相关。这就是为什么重要的是不要简单地描述情况,重要的是给出实际的错误信息(事实上,实际上要注意它们......因为它们告诉你问题是什么; - )

这里的问题是你有字母数字EMP_ID,这意味着你需要引用这个值,例如:

SELECT *
FROM TBL_CHILD
WHERE EMP_ID = '#mysql_id#'

虽然你不应该这样做,正如我在最初的评论中提到的那样。您应该始终将动态数据值作为参数传递,而不是在SQL中对它们进行硬编码。所以它应该是这样的:

SELECT *
FROM TBL_CHILD
WHERE EMP_ID = <cfqueryparam value="#mysql_id#" cfsqltype="CF_SQL_VARCHAR"> <!--- I'm guessing at VARCHAR --->

另外,@ Candide可能是正确的(事实上几乎肯定是!)...如果mysql_id来自的查询为空,那么mysql_id将是一个空字符串,这是这里也无效。你需要检查一下。

最后......不要使用SELECT *。指定您真正想要的列(并且您真正想要的列)。这与您的问题无关,只是“良好做法”。

答案 3 :(得分:-1)

实际上,错误是由MSSQL和MySQL中的EMP_NUMBER的差异引起的。

例如:

EMP NUMBER in MSSQL = 080, but in MySQL is stored as 80. 

EMP NUMBER in MSSQL = 070, but in MySQL is stored as 70. 

所以要解决这个问题,我所做的只是修剪 mysql_id

<cfset mysql_id =rereplace(mysql_id,'^0+','','ALL')>

感谢所有答案,对此无关紧要的问题感到非常抱歉。