2009-05-29 13 views
13

El objetivo es reemplazar un valor entero que se devuelve en una consulta SQL con el valor char que representa el número. Por ejemplo:SQL select replace entero con la cadena

Un atributo de tabla etiquetado 'Sport' se define como un valor entero entre 1-4. 1 = Baloncesto, 2 = Hockey, etc. A continuación se muestra la tabla de la base de datos y luego el resultado deseado.

base de datos Tabla:

Player  Team  Sport 
-------------------------- 
Bob  Blue  1 
Roy  Red  3 
Sarah  Pink  4 

desee tener salidas:

Player  Team  Sport 
------------------------------ 
Bob  Blue  Basketball 
Roy  Red  Soccer 
Sarah  Pink  Kickball 

¿Cuál es la mejor práctica para traducir estos valores enteros para valores de cadena? Use SQL para traducir los valores antes de pasar al programa? ¿Utiliza lenguaje de scripting para cambiar el valor dentro del programa? Cambiar el diseño de la base de datos

Respuesta

16

La base de datos debe contener los valores y debe realizar una unión a otra tabla que contenga esos datos.

por lo que debe tener una tabla que tiene decir una lista de personas

Nombre Identificación FavSport
1 Alex 4
2 Mosquitos 2

y luego otra tabla que tiene una lista de los deportes

ID Sport
1 Baloncesto
2 Fútbol
3 fútbol
4 Kickball

allí tendría que hacer una unión entre estas tablas

select people.name, sports.sport 
from people, sports 
where people.favsport = sports.ID 

lo que va a devolver

Nombre Deporte
Alex Kickball
Gnat Fútbol

También podría utilizar una declaración de caso, p. Ej. simplemente utilizando la tabla de personas de arriba, podría escribir algo como

select name, 
     case 
     when favsport = 1 then 'Basketball' 
     when favsport = 2 then 'Football' 
     when favsport = 3 then 'Soccer' 
     else 'Kickball' 
     end as "Sport" 
from people 

Pero eso ciertamente no es la mejor práctica.

+1

Suena bien. Desafortunadamente en este proyecto no se me ha dado la capacidad de diseñar o hacer cambios en la base de datos. Entonces, debo ir con la declaración del caso. Sin embargo, la tabla de unión tiene mucho sentido. De hecho, estaba haciendo algo similar con PHP, creé una función que pasé el nombre del atributo y el valor. Luego verificó una matriz de índice que creé para buscar qué cadena correspondía a qué valor. Entonces esencialmente lo mismo. Gracias por su respuesta. – Cimplicity

+0

No tiene que crear una tabla permanente. Sería mejor, pero hay otras alternativas, dependiendo del DBMS. Tablas temporales, Expresiones de tabla comunes, Constructores de valores de tabla. –

2

La expresión CASE podría ayudar. Sin embargo, puede ser aún más rápido para tener una pequeña mesa con una clave principal y una cadena int name como

1 baseball 
2 football 

etc, y JOIN de manera apropiada en la consulta.

8

MySQL tiene una declaración CASE. Los siguientes trabajos de SQL Server:

SELECT 
    CASE MyColumnName 
     WHEN 1 THEN 'First' 
     WHEN 2 THEN 'Second' 
     WHEN 3 THEN 'Third' 
     ELSE 'Other' 
    END 
+0

Sí. Pero un JOIN aún puede ser preferible (los benchmarks son obligatorios ;-). –

+0

sí lo hace, pero no es realmente el enfoque correcto aquí. –

1

¿Cree que sería útil para almacenar estas relaciones entre enteros y cadenas en la base de datos en sí? Siempre que tenga que almacenar estas relaciones, tiene sentido almacenarlas cerca de sus datos (en la base de datos) en lugar de almacenarlos en su código, donde pueden perderse. Si usa esta solución, esto haría que el entero fuera una clave foránea para los valores en otra tabla. Puede almacenar enteros en otra tabla, digamos sports, con sport_id y sport, y únalos como parte de su consulta.

En lugar de SELECT * FROM my_table, podría SELECT * from my_table y usar appropriate join. Si no cada fila en su columna principal tiene un deporte correspondiente, puede usar una combinación izquierda, de lo contrario, seleccione de ambas tablas y use = en la cláusula where donde probablemente sea suficiente.

1

Definitivamente, el DB tiene los valores de cadena. No soy un experto en DB de ninguna manera, pero recomendaría que crees una tabla que contenga las cadenas y sus valores enteros correspondientes. A partir de ahí, puede definir una relación entre las dos tablas y luego hacer un JOIN en la selección para extraer la versión de cadena del entero.

tblSport Columns 
------------ 
SportID int (PK, eg. 12) 
SportName varchar (eg. "Tennis") 


tblFriend Columns 
------------ 
FriendID int (PK) 
FriendName (eg. "Joe") 
LikesSportID (eg. 12) 


In this example, you can get the following result from the query below: 
SELECT FriendName, SportName 
FROM tblFriend 
INNER JOIN tblSport 
ON tblFriend.LikesSportID = tblSport.SportID 

hombre, es tarde - espero que me dieron ese derecho. por cierto, debes leer los diferentes tipos de combinaciones: este es el ejemplo más simple de una.

3

En Oracle puede utilizar la función DECODE que proporcionaría una solución donde el diseño de la base de datos está fuera de su control.

enter image description here

Directamente desde el oráculo documentation:

Ejemplo: En este ejemplo se decodifica la warehouse_id valor. Si warehouse_id es 1, la función devuelve 'Southlake'; si warehouse_id es 2, devuelve 'San Francisco'; Etcétera. Si warehouse_id no es 1, 2, 3 o 4, la función devuelve 'No nacional'.

SELECT product_id, 
     DECODE (warehouse_id, 1, 'Southlake', 
          2, 'San Francisco', 
          3, 'New Jersey', 
          4, 'Seattle', 
           'Non domestic') "Location" 
    FROM inventories 
    WHERE product_id < 1775 
    ORDER BY product_id, "Location"; 
Cuestiones relacionadas