MySQL-使用MAX查询GROUP_CONCAT中的加密值

时间:2015-12-15 11:33:54

标签: mysql sql encryption

我在获取加密值时遇到错误  GROUP_CONCAT(DISTINCT CONCAT('MAX(IF 标签,实际上我试图获取表的透视值,我有两个表有数千行值但是为了简单起见我在下面给出了一些 -

individual_data table as,

-----------------------------------
|ID         |fieldname  |answertext|
-----------------------------------
|30101      |state      |0         |
-----------------------------------
|30101      |Number |4         |
-----------------------------------
|30101      |Name       |Rajbanshi |
-----------------------------------
|30101      |Main       |RAJBANSHI |
-----------------------------------
|30101      |Surname    |RAJBANSHI |
-----------------------------------
|30201      |state      |0         |
-----------------------------------
|30201      |Number     |4         |
-----------------------------------
|30201      |Name       |Pawar     |
-----------------------------------
|30201      |Main       |Ramesh    |
-----------------------------------
|30201      |Surname    |Pawar     |
-----------------------------------

*注意 - 在此表中'aswertext'字段已加密,但为了清楚起见,我已经给出了实际值,我需要将这些值显示在输出中...

和sms_household表为,

-------------------------
|HHID   |sampletype |urid|
-------------------------
|30100  |3          |3008|
-------------------------
|30200  |4          |3005|
-------------------------

并希望得到所需的结果,

------------------------------------------------------------------------------
|ID     |state  |Number |Name       |Main       |Surname    |sampletype |urid |
------------------------------------------------------------------------------
|30101  |0      |4      |Rajbanshi  |RAJBANSHI  |RAJBANSHI  |3          |3008 |
------------------------------------------------------------------------------
|30201  |0      |4      |Pawar      |Ramesh     |Pawar      |4          |3005 |
------------------------------------------------------------------------------

对于同样的我写了像

这样的查询
SET @@group_concat_max_len = 3000;
SET @sql = NULL;
SELECT 
GROUP CONCAT (DISTINCT 
CONCAT(
'MAX(IF(I.fieldname = ''',
fieldname, 
''', convert(aes_decrypt(answertext,'xyz')USING utf8), NULL)) AS ',
fieldname
)
) INTO @sql
FROM individual_data;

SET @sql = CONCAT('SELECT I.ID, H.sampletype, H.urid', @sql,
'FROM individual_data I inner join sms_household H on H.hhid = concat'(left(I.ID,4),'0')' and H.hhid like '30%' and H.urid like '30%' GROUP BY I.prim_key');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;`

但是我在`convert(aes_decrypt(answertext,'basbas')USING utf8)中得到了语法错误信息,NULL))AS'.....

我没有得到这段代码的错误.. !!

1 个答案:

答案 0 :(得分:0)

您的代码非常难以理解。至少你有group_concat()的拼写错误和'xyz'左右的引用不足。

这些类型的陈述很难构建。我喜欢使用replace()而不是concat()的方法。这使得更清楚地看到最终表达式的结构。

所以,像这样:

set @exp = 'max(case when i.fieldname = ''@f''
                     then convert(aes_decrypt(@a, ''xyz'') USING utf8)
                end) as @f'

select group_concat(distinct replace(replace(@exp, '@f', fieldname
                                            ), '@a', answertext
                                    )
                   ) INTO @sql
FROM individual_data;

我不是100%确定这是否是你的意图,但这应该会让你走上更好的道路。