2012-03-09 18 views
6

Tengo aquí una tabla de muestra con tres campos.SELECCIONAR instrucción con substr en WHERE Cláusula

TableA 

    FieldA  FieldB  FieldC 
    ====================================== 
    123XYZ456  XYZ   John 
    124NNN333  NNN   Jenny 
    232XPT124  XPT   Jade 
    456XXX345  XXX   James 

FieldA tiene un FixedLength de 9. No diseñé esta mesa y algunas aplicaciones ya están utilizando.

Quiero seleccionar FieldB y FieldC con condiciones contra FieldA.

Utilizando esta sentencia SQL:

SELECT FieldB, 
     FieldC 
FROM TableA 
WHERE FieldA LIKE Concat(@paramA, '%', @paramB) 

no puede lograr el resultado deseado. Cuando trato de buscar con valor PARAMA de 12 y el valor de paramB '', consigo los resultados 2:

FieldA  FieldB  FieldC 
    ====================================== 
    123XXX456  XXX   John 
    124XXX333  XXX   Jenny 

porque, obviamente, de que coincide con 12% y eso no es lo que quiero. Quiero que los parámetros coincidan con el índice correcto de la cadena.

Si busco paramA = '12' y paramB = '' entonces no debería tener ningún resultado. Para obtener los campos (FieldB, FieldC), necesito los valores correctos de paramA = '123' y paramB = '456', por lo que devolverá XYZ y John. Si quiero devolver James tengo que dar paramA = '456' y paramB = '345'

¿Cómo podría crear correctamente una declaración de SQL para esto? ¿Alguna idea? Gracias.

+0

ur básicamente concierne ABT 3 primeros y últimos 3 caracteres correctos? – Teja

+0

¡Exactamente! Eso es lo que quería. –

Respuesta

14

Uso LEFT() y RIGHT():

SELECT FieldB, FieldC 
FROM TableA 
WHERE LEFT(FieldA,3) = @paramA 
     AND RIGHT(FieldA,3) = @paramB; 
+0

gracias Adam. Volveré en 3 minutos para aceptar la respuesta. :) –

+0

De nada. Me alegra que podamos ayudar. – bernie

+0

+1 para una solución de trabajo, pero la pregunta restante es entonces * ¿por qué * no funciona LIKE LIKE? –

3
SELECT Field2,Field3 
FROM TABLE 
WHERE SUBSTR(Field1,1,3)='123' AND SUBSTR(Field1,7,3)='456' 
1

No ha dejado claro por qué estás permitiendo incluso paramB a estar en blanco en su validación de entrada, pero para obtener el comportamiento exacto que usted ha descrito podría simplemente comprobar si ese caso, es decir:

WHERE @paramA!='' AND @paramB!='' AND FieldA LIKE Concat(@paramA, '%', @paramB) 
0

este modo: por ejemplo, la tabla de clasificación: Hogares en América, tierras de América, etc ..

mysql_query("select classification from properties where LEFT(classification, 5) = 'Homes'"); 

Resultado: Casas